【问题标题】:Updating bindings on properties that are automatically calculated更新自动计算的属性的绑定
【发布时间】:2012-01-27 12:05:12
【问题描述】:

我在 WPF 中有 3 个文本框绑定到我的业务对象的三个属性。 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 后如何更新 Result1 和 Result2 的绑定?

谢谢

【问题讨论】:

    标签: c# wpf properties data-binding


    【解决方案1】:

    如果您的 ViewModel 正在实现 INotifyPropertyChanged 事件,您希望(不幸地)放弃这些自动属性,并在 Length1、Length2 或 Length3 更改时引发 PropertyChanged 事件。

    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");
       }
    

    【讨论】:

    • 谢谢亚当,我想我可能不得不走这条路。委托的使用很好。
    【解决方案2】:

    使用 INotifyPropertyChanged 并在 Length1、Length2 和 Length3 中引发 Result1 和 Result2 的事件。

    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));
        }
    }   
    

    【讨论】:

    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 2019-06-18
    • 2016-06-08
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多