2011-09-14 200 views
0

我在C#中有一个实现INotifyPropertyChanged并包含几个绑定属性的业务对象。简单地说,它看起来像这样:从另一个绑定属性的setter中设置绑定属性的值

public class BusinessObject : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, e); 
     } 
    } 

    private int _intProperty; 
    public int IntProperty // bound to NumericUpDown control 
    { 
     get { return _intProperty; } 
     set 
     { 
      if (_intProperty == value) 
      { 
       return; 
      } 

      _intProperty = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("IntProperty")); 

      // if IntProperty is > 10, then set BoolProperty to false 
      if (value > 10) 
      { 
       this.BoolProperty = false; 
       //OnPropertyChanged(new PropertyChangedEventArgs("BoolProperty")); 
      } 
     } 
    } 

    private bool _boolProperty; 
    public bool BoolProperty // bound to CheckBox 
    { 
     get { return _boolProperty; } 
     set 
     { 
      if (_boolProperty == value) 
      { 
       return; 
      } 

      _boolProperty = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("BoolProperty")); 
     } 
    } 

正如你可以在二传手的IntProperty看,我设置BoolProperty = false当IntProperty已经设置> 10. BoolProperty绑定到一个CheckBox我UI(winforms),但即使我设置BoolProperty = false,CheckBox不会更新以反映该更改,直到绑定到IntProperty的控件失去焦点。我想也许我需要在设置BoolProperty = false后调用OnPropertyChanged,但这似乎没有什么区别。这是这种情况下的预期行为吗?如果是这样,是否有可能实现我描述的行为?

+3

什么是你的绑定DataSourceUpdateMode,应该DataSourceUpdateMode.OnPropertyChanged。 – stuartd

+0

你绝对正确。我使用设计器创建了所有绑定,并通过单击相应的属性来设置它们。所以我假设DataSourceUpdateMode.OnValidation是默认的,如果你不在设计器中使用“高级”DataBindings对话框,或者在代码中设置绑定并指定它?无论如何,非常感谢您的快速回复。如果您想用此信息“回答”我的问题,我会很乐意接受并为您提供赞赏。再次感谢你! – user685869

+0

会做,谢谢。 – stuartd

回答

1

您可能需要设置绑定的DataSourceUpdateModeDataSourceUpdateMode.OnPropertyChanged