2

我有一个简单的问题,在Silverlight 3.0中设置复选框的双向数据绑定。它一定是一个无脑的,但可能我今天忘了我的大脑家园...Silverlight复选框双向绑定不能按预期工作

我定义了一个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位,那么即使Model正在实现接口,UI也不会注意到基础数据更改。

我该怎么做才能:

  1. 必须在启动
  2. 绑定到数据的复选框有复选框器isChecked变化修改基础数据
  3. 有复选框检测到基础数据的变化和更新自己?

回答

8

您已在设定财产过程中有一个排序的错误,你需要分配到_value之前通知的变化: -

set 
    { 
     this._value = value; 
     if (this.PropertyChanged != null) 
      this.PropertyChanged(this, new PropertyChangedEventArgs("Value")); 

    } 
+0

谢谢!有效。我告诉过你我今天忘了我的大脑:)) – 2009-09-01 11:14:25