更新绑定到依赖属性的 UI

本文关键字:UI 属性 依赖 绑定 更新 | 更新日期: 2023-09-27 17:55:36

>我有几个属性,它们返回依赖于另一个属性的值的值。 更新绑定到依赖属性的 UI 的最佳方法是什么?请参阅下面的示例,当子集合中的 Quantity 更改时,如何更新绑定到 Parent 对象的 TotalQuantity 属性的 UI 元素?

public class Child : INotifyPropertyChanged
{
    private int quantity;
    public int Quantity
    {
        get
        {
            return quantity;
        }
        set
        {
            quantity = value;
            OnPropertyChanged("Quantity");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        this.VerifyPropertyName(propertyName);
        if (this.PropertyChanged != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            this.PropertyChanged(this, e);
        }
    }
}
public class ParentObject : INotifyPropertyChanged
{
    private ObservableCollection<Child> children;
    public ObservableCollection<Child> Children
    {
        get
        {
            return children;
        }
        set
        {
            children = value;
            OnPropertyChanged("Children");
        }
    }
    public int TotalQuantity
    {
        get
        {
            return Children.Sum(c => c.Quantity);
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        this.VerifyPropertyName(propertyName);
        if (this.PropertyChanged != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            this.PropertyChanged(this, e);
        }
    }
}

更新绑定到依赖属性的 UI

当你实例化你的ObservableCollection时,你需要订阅CollectionChanged事件。

Children.CollectionChanged += Children_CollectionChanged;

当从集合中添加/删除项时,将调用此值。您只需要通知TotalQuantity已更改即可。

void Children_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    OnPropertyChanged("TotalQuantity");
}

如果需要在子项更改时更新 UI 上的 TotalQuantity 属性,则只需订阅子项的PropertyChanged事件。

因此,当您将项目添加到集合时,请订阅事件:

Child myChild = new Child(); //Just an example, but you get the idea
myChild.PropertyChanged += myChild_PropertyChanged;

在事件处理程序中,您可以测试以查看更改了哪些属性。

void myChild_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName == "Quantity")
       OnPropertyChanged("TotalQuantity");
}

或者,你可以打电话给OnPropertyChanged而不检查你是否是一个坏蛋。但我不推荐它,以防万一您的模型将来获得更多属性。

从集合中删除子项之前,不要忘记取消订阅事件。