0

私は完全にうまく機能するシンプルなトグルボタンを持っています。トグル ボタンをクリックして、表示される画像を変更できます。私が今やりたいことは、コードビハインドと同じことです。似ているリンクを見つけました

編集:これは私がやりたいことです

WPF ToggleButton.IsCheckedバインディングが機能しない必要があることを正確に伝える次のスレッドを読みました

プログラム的に、私のコードは何の効果もないようです。UIをクリックすると機能しますが、プログラム内から状態を変更したいです。以下のプログラムは単なるプロトタイプです。

XAML またはコードの何が問題なのかわかりません。最後に、すべてをテスト プログラムとして貼り付けることを決定しました。

XAML :

<Window x:Class="ToggleButtonImageChange.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ToggleButtonImageChange"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>

        <Image Source="secured.jpg"

         x:Key="MyImage1" />

        <Image Source="unsecured.jpg"

         x:Key="MyImage2" />



        <Style TargetType="{x:Type ToggleButton}"

         x:Key="MyToggleButtonStyle">

            <Setter Property="Content"

            Value="{DynamicResource MyImage2}" />

            <Style.Triggers>

                <Trigger Property="IsChecked"

               Value="True">

                    <Setter Property="Content"

                Value="{DynamicResource MyImage2}" />

                </Trigger>

            </Style.Triggers>

        </Style>

    </Window.Resources>

    <Grid>

        <ToggleButton Style="{StaticResource MyToggleButtonStyle}" Name="tgbtn" Margin="0,29,0,139" IsChecked="{Binding Path=isAdmin, Mode=TwoWay}"/>
       
    </Grid>
</Window>

コードビハインド:

namespace ToggleButtonImageChange
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window,INotifyPropertyChanged
    {
        bool _isAdmin;
        public MainWindow()
        {
            InitializeComponent();

             isAdmin = true;
            OnPropertyChanged("isAdmin");

        }
         public bool isAdmin
        {
            get
            {
                return _isAdmin;
            }

            set
            {
                _isAdmin = value;
                OnPropertyChanged("isAdmin");
            }
        }

        private void OnPropertyChanged(string p)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(p));
        }

        public event PropertyChangedEventHandler PropertyChanged;
    
    }

デバッガーに入ると、isAdmin を true に設定しても、ボタン isChecked が false のままであるため、正しくない画像が表示されることがわかりました。何が間違っていたのか、コードを介して isChecked を変更する方法がよくわかりません。

4

1 に答える 1

1

xaml ファイルを次のように変更してみてください。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="350" Width="525"
        x:Name="TestWindow">
    <Window.Resources>
        <Image Source="secured.png" x:Key="MyImage1" />
        <Image Source="unsecured.png" x:Key="MyImage2" />
        <Style TargetType="{x:Type ToggleButton}" x:Key="MyToggleButtonStyle">
            <Setter Property="Content" Value="{DynamicResource MyImage2}" />
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="Content" Value="{DynamicResource MyImage1}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <ToggleButton x:Name="tgbtn"
                      Margin="0,29,0,139" 
                      Style="{StaticResource MyToggleButtonStyle}"
                      IsChecked="{Binding Path=isAdmin, Mode=TwoWay, ElementName=TestWindow}"/>
    </Grid>
</Window>

デフォルトのContent値はMyImage2を使用していますが、トリガーはそれをMyImage1に設定していることに注意してください。異なる画像である必要があるだけです。

また、ルート ウィンドウ要素に追加したx:Name="TestWindow"にも注意してください。これは後でバインディングで使用されます。

{Binding Path=isAdmin, Mode=TwoWay, ElementName=TestWindow}

これは基本的に、期待どおりに機能させるために変更する必要があるすべてのことだと思います。

また、次のようにコンストラクターをコード ビハインドに残すこともできますが、これはオプションの変更です。

public MainWindow()
{
    InitializeComponent();
    isAdmin = true;
}

それが役立つことを願っています。

于 2013-05-31T08:51:11.643 に答える