canard29 Ответов: 1

Цикл уведомлений модели Wpf


Привет,

Я создаю 2 экземпляра одной и той же модели для 2 окон. Класс, с помощью которого осуществляется коммуникация, называется "менеджер".
Я хочу уведомить второе окно, когда свойство изменяется в первом окне. Модель реализует
INotifyPropertyChanged


Когда значение изменяется во втором, это вызывает событие
public bool MyProperty
{
    get { return _myProperty; }
    set
    {
        _myProperty = value;
        OnPropertyChanged();
    }
}

public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged([CallerMemberName]string caller = null)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(caller));
            }
        }



В менеджере я получу уведомление и обновлю все экземпляры моделей
private void Vm_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    var prop = TypeDescriptor.GetProperties(sender)[e.PropertyName];
    if (prop != null)
    {
        object val = prop.GetValue(sender);
        SynchronizeViews(e.PropertyName, val);
    }
}

private void SynchronizeViews(string propertyName, object val)
{
    foreach(MainViewModel vm in MainViewModelList)
    {
        vm.MyProperty = (bool)val;
    }
}



В конце концов, это не работает, потому что я делаю петлю !!!!

Что я уже пробовал:

Смотрите содержание сообщения, описывающего то, что я пробовал.

1 Ответов

Рейтинг:
0

Clifford Nelson

INotifyPropertyChanged предназначен для связи от ViewModel к представлению и использует много внешней логики. Вы могли бы сделать все это с созданием привязки, но, вероятно, было бы гораздо проще просто заставить модель выполнять событие всякий раз, когда происходит изменение, которое наблюдается обеими моделями представления. Когда ViewModel получает уведомление об изменении, он гарантирует, что его значение соответствует новому значению в модели.

Еще одна вещь, которую вы могли бы сделать, - это иметь ссылку в обеих моделях представлений на класс, содержащий свойства, которые разделяют два представления, и таким образом, когда одно представление вносит изменение, оно изменяет значение в этом общем классе, и это свойство при изменении выполняет событие PropertyChanged.