我有一个简单的问题,即在Silverlight 3.0中设置复选框的双向数据绑定。它必须是明智的,但我今天可能忘记了我的大脑......
我定义了一个Model类来表示我的''数据'。我实现了INotifyPropertyChanged接口,使UI能够查看数据何时发生变化。
public class Model : INotifyPropertyChanged
{
private bool _value;
public bool Value
{
get { return this._value; }
set
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Value"));
this._value = value;
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
接下来,我在...'表单'上放了一个复选框和一个按钮:
<StackPanel Orientation="Horizontal">
<CheckBox x:Name="check" IsChecked="{Binding Value, Mode=TwoWay}" Content="SomeLabel"/>
<Button Click="Button_Click" Content="Test" />
</StackPanel>
然后我在构造函数中提供了数据:
public MainPage()
{
InitializeComponent();
this.DataContext = new Model() { Value = true };
}
问题是你必须在复选框上单击两次才能检查/取消选中,除非我取消执行INotifyPropertyChanged。但是,如果取消实现它,则UI不会注意到我是否更改了基础数据。
如果我从IsChecked绑定表达式中删除Mode = TwoWay位,那么即使模型正在实现接口,UI也不会注意到基础数据的变化。
我该怎样做:
答案 0 :(得分:8)
您的设置属性过程中出现了排序错误,您需要在通知更改前指定_value
: -
set
{
this._value = value;
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Value"));
}