两个类之间的绑定和属性更改

时间:2019-01-22 15:27:58

标签: c# wpf

我有两个实现INotifyPropertyChanged的类,它们分别按预期工作。但是,我在一个类(ClassA)中添加了一个属性(Status),该属性根据另一个类(ClassB)中的值提供了一个值,并且当ClassB中的成员发生更改时,我没有在ClassA中获得更新

基本上,ClassA具有一个保存ClassB列表的属性,我的想法是,当ClassB中的一个成员发生更改时,它将反映并更新ClassA中Status的绑定。

这是一个例子...

public class ClassA : BaseModel
{
    private ConnectionStatus _status;
    public ConnectionStatus Status
    {
        get
        {
            ConnectionStatus status = ConnectionStatus.Disconnected;

            foreach (ClassB classB in ClassBs)
            {
                status = classB.Status;

                if (status != ConnectionStatus.Connected)
                {
                    break;
                }
            }

            return status;
        }
    }

    private ObservableCollection<ClassB> _classBs;
    public ObservableCollection<ClassB> ClassBs
    {
        get { return _classBs; }
        set
        {
            _classBs = value;
            OnPropertyChanged();
            OnPropertyChanged("Status");
        }
    }
}

public class ClassB : BaseModel
{
    private ConnectionStatus _status;
    public ConnectionStatus Status
    {
        get { return _status; }
        set
        {
            _status = value;
            OnPropertyChanged();
        }
    }
}

XAML:

<TextBlock Text="{Binding Path=ClassAObject.Status}" />

Status属性在被调用时将反映正确的值,但是我在XAML中具有的绑定没有改变。

DataContext和Binding的设置正确,如果我手动更新Status,它将更新,而不是在ClassBs中的成员更新时更新。

1 个答案:

答案 0 :(得分:1)

Observable集合已经实现了INotifyPropertyChanged,因此您不需要在属性ClassB中调用OnPropertyChanged

[System.Serializable]
public class ObservableCollection<T> : System.Collections.ObjectModel.Collection<T>, System.Collections.Specialized.INotifyCollectionChanged, System.ComponentModel.INotifyPropertyChanged

当类B中的status属性更改时,您不会收到通知的主要原因是因为类A中称为类B的属性是类B类型的对象的集合,并且对象本身不会更改,仅更改其中一个的属性元素,但集合是相同的。因此,引发通知的唯一方法是在集合中添加或删除和项。

private ObservableCollection<ClassB> _classBs;
    public ObservableCollection<ClassB> ClassBs
    {
        get { return _classBs; }
        set
        {
            _classBs = value;
            OnPropertyChanged();
            OnPropertyChanged("Status");
        }
    }

我建议您在ClassB内部创建一个EventHandler并从ClassA订阅