c# Wpf设置从后面使用INotifyPropertyChanged代码切换按钮

本文关键字:代码 INotifyPropertyChanged 按钮 设置 Wpf | 更新日期: 2023-09-27 18:16:06

我有一个简单的切换按钮,它工作得很好。我可以点击切换按钮改变它显示的图像。我现在要做的是与后面的代码相同的事情。找到一个类似的链接

编辑:这就是我想做的

我读了下面的线程,告诉我到底需要做什么
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

c# Wpf设置从后面使用INotifyPropertyChanged代码切换按钮

尝试将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;
}

希望对你有帮助。