建议您传递字符串文字的两个答案"Checked"
会起作用,但恕我直言,这不是最好的方法。相反,我更喜欢使用[CallerMemberName]
当实施OnPropertyChanged()
方法。 (我不知道第三个答案是关于什么的……它似乎与这个问题没有任何关系,我猜它只是从其他地方复制/粘贴的)。
这是我如何写你的例子State
class:
class State : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private bool _checked;
public bool Checked
{
get { return _checked; }
set { _checked = value; OnPropertyChanged(); }
}
public void Toggle()
{
Checked = !Checked;
}
public State(bool c)
{
this.Checked = c;
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
这里的关键是标记为的参数[CallerMemberName]
只需不传递任何值,就会自动填充调用者的正确值。默认值为null
是否存在这样编译器将允许调用者不传递值。
请注意,我还简化了Toggle()
方法。没有必要使用if
改造一的声明bool
价值转化为他人;这就是布尔运算符的用途。
我也改变了OnPropertyChanged()
方法,以便它是线程安全的,即如果某些代码取消订阅最后一个处理程序,则不会崩溃PropertyChanged
事件字段与事件字段进行比较的时间之间的事件null
以及事件实际引发的时间。通常,这不是问题,因为这些属性几乎总是仅从单个线程访问,但很容易防范,并且是一个好习惯。
请注意,在 C# 6 中,您可以选择只编写PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
对于方法体。并不是每个人都 100% 地使用新的编译器,所以我只是将其作为您的可选选择。
当然,你还需要设置DataContext
正确,如图所示其他答案之一 https://stackoverflow.com/a/36971642:
public MainWindow()
{
InitializeComponent();
_state = new State((bool)checkBox.IsChecked);
this.DataContext = _state;
}
不过,就我个人而言,我不确定我是否会为构造函数烦恼。您似乎没有其他代码可以设置checkBox.IsChecked
,所以在我看来,无论如何你总是会得到默认值。此外,如果视图模型类没有参数化构造函数,则无法在 XAML 中创建视图模型类。将来,您可能更愿意配置您的DataContext
像那样。例如。:
<Window.DataContext>
<l:State Checked="True"/>
</Window.DataContext>
在窗口的构造函数中:
public MainWindow()
{
InitializeComponent();
_state = (State)this.DataContext;
}
另请参阅相关问答自动 INotifyPropertyChanged https://stackoverflow.com/q/527602。那里的问题确实是关于不同的东西 - 他们想要实现接口,而不必在属性设置器中显式编写任何内容 - 但无论好坏,他们得到的答案实际上更多的是关于您的场景,这只是一个问题简化属性设置器实现而不是使其完全自动化。
我不得不承认,我本以为已经有另一个问题可以将您的问题标记为重复项。而且我确实找到了很多related问题。但没有什么直接关注“我如何实现和使用实现INotifyPropertyChanged
?”,这确实是你的问题。
Addendum:
我做了一些更多的搜索,虽然这些似乎都不会被认为是完全重复的,但它们都有很好的信息,可以帮助解决有关实施的问题INotifyPropertyChanged
:
属性的使用... INotifyPropertyChanged https://stackoverflow.com/q/1662745
模型和视图模型的 INotifyPropertyChanged https://stackoverflow.com/q/23359154
BindableBase 与 INotifyChanged https://stackoverflow.com/q/28844518
如何在 MVVM (WPF) 中编写“ViewModelBase” https://stackoverflow.com/q/36149863