【发布时间】:2016-08-26 12:54:19
【问题描述】:
这里是新手。我一直在尝试围绕数据绑定,并想尝试将视图中的复选框双向绑定到我称为“状态”的单独类中的布尔值。关键是要确保它们始终保持同步。
所以我在视图中创建了一个复选框,并将其绑定到上述状态类中的布尔属性,并附带一个绕过复选框并直接切换布尔属性的按钮(恰当地标记为“忍者!”)。重点是测试复选框的数据绑定在属性更改时是否会做出反应。但是,我无法弄清楚在属性更改时应该如何调用 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"/>
以及我制作的“状态”类的代码:
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 需要一个 String propertyName,但我不知道这会带来什么。当我输入属性的名称(Checked)时,那自然是指布尔值,而不是字符串。我没有得到什么?还有什么我做错了,因为当我通过按钮更改复选框时,复选框没有注册属性更改?
【问题讨论】:
标签: c# wpf data-binding