2011-12-25 24 views
1

我有3个文本框在WPF中绑定到我的业务对象的三个属性。 texboxes允许用户输入三种不同的长度。更新自动计算属性的绑定

然后我有一些文本块绑定到其他属性,显示从3输入简单的计算。这些属性的值在每个属性的get方法计算如下:

public double Length1 { get; set } 
public double Length2 { get; set } 
public double Length3 { get; set } 
public double Result1 
{ 
    get { return Length1 - Length2 - Length3; } 
} 
public double Result2 
{ 
    get { return Length1 + Length2 + Length3; } 
} 

如何Lengths1,2或3进行更改后我可以更新结果1和结果2的绑定?

感谢

回答

3

如果您的视图模型被imnplementing在INotifyPropertyChanged的情况下,你要(不幸)沟的汽车性能,并提高PropertyChanged事件时长度1,长度2或长度3被改变。

PropertyChanged(this, new PropertyChangedEventArgs("Result1")); 

private double _length1; 
public double Length1 { 
    get { return _length1; } 
    set { 
     _length = value; 
     PropertyChanged(this, new PropertyChangedEventArgs("Result1")); 
     PropertyChanged(this, new PropertyChangedEventArgs("Result2")); 
     PropertyChanged(this, new PropertyChangedEventArgs("Length1")); 
    } 

不过这样会很累相当快,所以我通常实现一个辅助方法:

void RaiseThese(params string[] properties){ 
    foreach(string prop in properties) 
     PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
} 

然后

public double Length1 { 
    get { return _length1; } 
    set { 
     _length = value; 
     RaiseThese("Result1", "Result2", "Length1"); 
    } 
+0

感谢Adam,我想我可能必须这样做。代表的使用很好。 – 2011-12-25 08:20:50

2

使用INotifyPropertyChanged,提高在长度1,长度2和长度3的结果1和结果2的事件。

private double _length1; 
public double Length1 
{ 
    get { return _length1; } 
    set 
    { 
     if (_length1 == value) return; 
     _length1 = value; 
     OnPropertyChanged("Length1"); 
     OnPropertyChanged("Result1"); 
     OnPropertyChanged("Result2"); 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 
private void OnPropertyChanged(string propertyName) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

一招我从乔恩斯基特的书中学到什么 - 你可以避开那些恼人的空检查通过声明你的事件像这样的公共事件PropertyChangedEventHandler PropertyChanged =委托{};' – 2011-12-25 02:10:33

+0

@Adam我知道,谢谢。有很多这方面的信息,例如[避免检查空事件处理程序](http://stackoverflow.com/a/9282/620360)或[在事件声明中添加匿名空空白代理是否有缺点?](http://stackoverflow.com/questions/170907/is-there-a-underside-to-adding-an-anonymous-empty-delegate-on-event-declaration) – LPL 2011-12-25 10:09:35