初学者在此。我一直在努力理解数据绑定,并想尝试将视图中的复选框双向绑定到一个名为“State”的单独类中的布尔值,以确保它们始终同步。
因此,我在视图中制作了一个复选框,并将其绑定到State类中上述的布尔属性,同时伴随着一个绕过复选框并直接切换布尔属性的按钮(恰当地标记为'Ninja!')。 这是为了测试当属性更改时复选框的数据绑定是否会产生反应。 然而,我不能找出当属性更改时OnPropertyChanged方法应该如何被调用。
这是我目前的代码:
<CheckBox x:Name="checkBox" Content="CheckBox" HorizontalAlignment="Left" Margin="232,109,0,0" VerticalAlignment="Top" IsChecked="{Binding Checked, Mode=TwoWay}"/>
<Button x:Name="button" Content="Ninja!" HorizontalAlignment="Left" Margin="228,182,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
以下是我编写的“State”类的代码:
namespace TestTwoWayBinding
{
class State : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private bool _checked;
public bool Checked {
get
{
return _checked;
}
set
{
_checked = value;
OnPropertyChanged(Checked);
}
}
public void Toggle()
{
if (!Checked)
{
Checked = true;
}
else
{
Checked = false;
}
}
public State(bool c)
{
this.Checked = c;
}
protected virtual void OnPropertyChanged(string propertyName)
{
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(Checked));
}
}
}
}
视图上的代码后台用于初始化和处理事件:
namespace TestTwoWayBinding
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private State _state;
public MainWindow()
{
InitializeComponent();
_state = new State((bool)checkBox.IsChecked);
}
private void button_Click(object sender, RoutedEventArgs e)
{
_state.Toggle();
}
}
}
据我所了解,OnPropertyChanged期望一个字符串propertyName,但我不知道这里需要什么。当我输入属性的名称(Checked)时,那自然是指一个布尔值,而不是一个字符串。我哪里没理解?还有,当我通过按钮更改复选框时,为什么它没有注册属性更改?
OnPropertyChanged
方法现在可以缩短为一行代码:PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- Toby