Связывание и изменение свойства между двумя классами - PullRequest
0 голосов
/ 22 января 2019

У меня есть два класса, которые реализуют INotifyPropertyChanged, и независимо они работают как положено. Тем не менее, я добавил свойство (Status) в один из классов (ClassA), которое дает значение на основе значений в другом классе (ClassB), и когда член в ClassB изменяется, я не получаю обновление в ClassA .

По сути, ClassA имеет свойство, которое содержит список ClassB, и моя идея состоит в том, что когда один из членов в ClassB изменяется, тогда это будет отражать и обновлять привязку для Status в ClassA.

Вот пример ...

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 голосов
/ 22 января 2019

Наблюдаемая коллекция уже реализует INotifyPropertyChanged, поэтому вам не нужно вызывать OnPropertyChanged внутри свойства ClassBs

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

Основная причина, по которой вы не получаете уведомление при изменении свойства status в классе B, заключается в том, что свойство в ClassA, называемое ClassBs, представляет собой набор объектов типа ClassB, и объект itselft не изменяется, только изменяется свойство внутри одного элемент внутри него, но коллекция такая же. По этой причине единственный способ выбросить уведомление - добавить или удалить и поместить элемент в коллекцию.

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

Я предлагаю вам создать EventHandler внутри ClassB и подать заявку от ClassA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...