【问题标题】:How to execute code when a property is changed using INotifyPropertyChanged使用 INotifyPropertyChanged 更改属性时如何执行代码
【发布时间】:2021-11-01 10:50:00
【问题描述】:

我最近才开始学习,所以这是一个新手问题。 也许有人可以帮助我解决我必须做的不同的事情才能让我的代码正常工作。

简而言之:我有一个继承自 INotifyPropertyChanged 的​​类(我试图根据 MSDN 实现)。当我按下一个按钮时,我想更改这个类中的一个变量,这反过来应该引发一个 PropertyChanged 事件。当引发事件时,应该执行一些代码。

我的 ValueChanged 类:

    public class ValueChange : INotifyPropertyChanged
{
    public ValueChange()
    {
        _size = 1;
    }
    private int _size;

    public int Size
    {
        get
        {
            return _size;
        }
        set
        {
            _size = value;
            OnPropertyRaised("Size");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyRaised([CallerMemberName] string name = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

我的事件监听器:

    public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ValueChange test = new ValueChange();
        test.Size = 10;
    }

    private void PropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        switch (args.PropertyName)
        {
            case "Size":
                // txtbox is just some textbox in my UI 
                txtbox.Text = "some text";
                
                // This is merely a placeholder as I´d like to be able to execute any code in here
                break;
        }
    }
}

【问题讨论】:

  • 当该类是控件的DataContext,并且其中一个属性绑定到视图模型时,将在值更改时调用绑定的setter。你可以在那个 setter 中有代码。
  • 如果您不想使用我之前评论中的 MVVM 模式,您可以通过将 test 设为类级别字段而不是局部变量并附加事件处理程序来修复当前代码在构造函数中使用test.PropertyChanged += PropertyChanged;。请记住,随着您的应用程序变得越来越复杂,这将变得非常难以管理。

标签: c# wpf


【解决方案1】:

代码存在一些问题。

  1. 每次单击时,您都会创建 ValueChange 类的新实例。
  2. 您没有订阅PropertyChanged 事件。

虽然这会修复您的代码,但您在此处使用PropertyChanged 而不是直接在Button_Click 事件处理程序中执行您的代码有什么原因吗? PropertyChanged 通常在绑定的时候使用,很少像你这里直接使用。

public partial class MainWindow : Window
{
    ValueChange test = new ValueChange();

    public MainWindow()
    {   
        test.PropertyChanged += PropertyChanged;
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        test.Size = 10;
    }

    private void PropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        switch (args.PropertyName)
        {
            case "Size":
                // txtbox is just some textbox in my UI 
                txtbox.Text = "some text";
                
                // This is merely a placeholder as I´d like to be able to execute any code in here
                break;
        }
    }
}

【讨论】:

  • 非常感谢您的回复!我想我明白我做错了什么。通常我会在您编写的 Button_Click 中直接执行代码。您使用绑定设置器的建议听起来像我最初寻找的艰难 - 执行代码,而不仅仅是将值绑定到控件。我会对此进行研究,因为它似乎比我在这里尝试做的更有意义。
猜你喜欢
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多