powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / MVVM - Как оповестить представление об изменении модели?
17 сообщений из 17, страница 1 из 1
MVVM - Как оповестить представление об изменении модели?
    #39097916
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня пока только вариант, что и модель, и модель представления должны реализовать INotifyPropertyChanged. Далее, модель представления подписывается на событие PropertyChanged модели и перебирарет все её свойства. Найдя то, которое изменилось, оповещает об этом представление. Т. е. примерно так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
public class Model : INotifyPropertyChanged
{
    public int A { get; set; }
    public int B { get; set; }

    // Реализация INotifyPropertyChanged
    // ...
}

public class ViewModel : INotifyPropertyChanged
{
    Model _model;

    public int A { ... }
    public int B { ... }

    // Реализация INotifyPropertyChanged
    // ...

    public ViewModel()
    {
        _model.PropertyChanged += ModelPropertyChanged;
    }

    void ModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        // Вызываем метод OnPropertyChanged текущей ViewModel, 
        // оповещающий представление об изменении свойства _model
        // через изменение свойства текущей ViewModel.

        if (e.PropertyName == "A")
            OnPropertyChanged("A");
        else if (e.PropertyName == "B")
            OnPropertyChanged("B");
    }
}



Проблема в обработчике ModelPropertyChanged. Если свойст будет много, то это какой-то boilerplate. Может, есть способ лучше?
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39097918
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, конечно, завести по обычному событию для каждого свойства модели, и подписывать вью модель на каждое такое событие модели по отдельности. Толко это ещё бОльший boilerplate.
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39097920
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, напрягает, что надо писать всю эту кучу вызовов OnPropertyChanged. Наверное, должен быть какой-то способ автоматизировать это? Автоматизировать задачу "оповестить вью об изменении модели".
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39097923
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кто не понял, то в конструкции

Код: c#
1.
2.
if (e.PropertyName == "A")
            OnPropertyChanged("A");



первое "А" - это имя свойства модели, а второе "А" - имя свойства вью модели. Просто они совпадают. Надо было назвать по-разному, наверное, для понимания.
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39097928
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, иногда первый способ удобен. Например, когда свойство модели составное, а свойства вью модели - нет:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Model : INotifyPropertyChanged
{
    public int[] Numbers { get; set; }
}

public class ViewModel : INotifyPropertyChanged
{
    Model _model;

    public int Number1 { get { return _model.Numbers[0]; } }
    public int Number2 { get { return _model.Numbers[1]; } }

    void ModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Numbers")
        {
            OnPropertyChanged("Number1");
            OnPropertyChanged("Number2");
        }
    }
}



Но чаще возникает именно бойлерплейт из первого сообщения, поэтому хотелось бы знать способ его обойти.
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39097932
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, может быть, кто-то знает, что мои поиски не нужны и будет лучшим подход именно в первом посте. Был бы рад, если бы кто-то объяснил, почему.
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39097948
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создавай свойства зависимости. Это нормальная практика для ViewModel-и
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39097970
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProСоздавай свойства зависимости. Это нормальная практика для ViewModel-и
Не понял, а как они помогут при оповещении об изменении в модели?
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39098015
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе не нужно об этом думать. Свойства зависимости реализуют нотификацию. Просто создаешь свойство зависимости вместо обычного свойства и привязываешь свойство представления к нему.
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39098019
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, что касается самой модели... ну тут какая-то неверная архитектура, раз у тебя свойство модели транслируется в представление. ВьюМодель не должна зависеть от свойств модели, это модель должна хранить свои свойства, касающиеся отображения, во ВьюМодели, а не в себе.
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39098022
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VOva01101модель представления подписывается на событие PropertyChanged моделито есть вот это - неверно
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39098073
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА, что касается самой модели... ну тут какая-то неверная архитектура, раз у тебя свойство модели транслируется в представление. ВьюМодель не должна зависеть от свойств модели, это модель должна хранить свои свойства, касающиеся отображения, во ВьюМодели, а не в себе.
Идёт какой-то процесс в модели и пользователь должен информароваться о состоянии модели. Я почти нигде в интернете не встречал подобного, чтобы модель информировала вью (через вью модель или ещё как-то). Везде через INotifyPropertyChanged только модель изменяется в ответ на действия пользователя, но не наоборот - модель сама изменяет UI пользователя.

Свойства зависимости, вроде, относятся к WPF, а мне надо, чтобы модель был чистой, без примеси UI-библиотек. Ну, разве что в крайнем случае.

У меня в примерах, кстати, пропущено - надо ещё изменить свойство вью модели. Т. е. не так

Код: c#
1.
2.
if (e.PropertyName == "A")
    OnPropertyChanged("A");



а так

Код: c#
1.
2.
3.
4.
5.
if (e.PropertyName == "A")
{
    A = _model.A;
    OnPropertyChanged("A"); // Это не нужно, если сеттер свойства А уже реализует оповещение.
}
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39098076
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрите классику https://msdn.microsoft.com/en-us/library/ff798384.aspx
Первый же ресунок - Model change events. Только вот в самой статье опять талдычат про оповещения между вью и вью моделью, а примера оповещения моделью вью модели и вью нет.
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39098088
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, собственно, то же советуют http://stackoverflow.com/a/15440949
Только когда будет много свойств у модели, которые надо обозревать - будет перебор всех этих свойств.

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

Но чего-то мне кажется, что это какой-то оверхед. Проще нельзя?
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39098096
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ну, вобще, она и пишет, что всякие отправки сообщение между объектами есть и прочие. Ладно, почитаю... Похоже, что событие в модели, подписка на него во вью модели и последующая установка свойства вью модели - это самое простое.
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39098358
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INotifyPropertyChanged в модели? шта?

свойства сущности должны быть readonly (по возможности), если нужно изменить свойство, то создается новый объект.
вызов PropertyChanged может быть только во ViewModel
...
Рейтинг: 0 / 0
MVVM - Как оповестить представление об изменении модели?
    #39098830
VOva01101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesINotifyPropertyChanged в модели? шта?

свойства сущности должны быть readonly (по возможности), если нужно изменить свойство, то создается новый объект.
вызов PropertyChanged может быть только во ViewModel
Так я и вызываю PropertyChanged модели представления в модели представления. А PropertyChanged модели я ОТСЛЕЖИВАЮ в модели представления, а не вызываю.

Я в любом случае в модели представления могу следить за свойствами модиле - просто проверять их переодически, не изменились ли они. А раз так, то лучше создать событие изменения свойства модели и подписаться на него в модели представления.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / MVVM - Как оповестить представление об изменении модели?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]