Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/76: Рейтинг темы: голосов - 76, средняя оценка - 4.55
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
WPF

MVVM бизнес логика и Model

02.11.2021, 00:10. Показов 16297. Ответов 132
Метки mvvm (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Я уже довольно долго пытаюсь разобраться что же представляет из себя архитектура MVVM, конкретно задачи View и ViewModel мне понятны. Но остается вопрос что из себя представляет Model? Много где есть определение Model = бизнес логика. Но как понять какую логику отнести к модели, а какую например к сервису.
К сожалению толкового ответа я не нашел, может плохо гуглил. В уроках обычно банальные примеры с расселением студентов по комнатам, что редко отображает реальное использование программы. На YouTube смотрел уроки по созданию MVVM приложению от Павла Шмачилина(https://www.youtube.com/watch?... P4&t=3630s), но именно про архитектуру он рассказывает не настолько подробно как хотелось бы.
Все что я понял это то что Model занимается некими правилами записи и получения данных из сервисов. Также предоставляет данные для ViewModel. Тоесть та самая бизнес логика (про нее я смотрел https://www.youtube.com/watch?v=9DW-xdwjop8) и преобразование данных. Но уверенности что я все понял как нужно, нет.
Ниже приведены примеры с которыми я сталкивался, но понятного для меня решения не нашел.

Первый пример
Пример как я это вижу:
На View есть Listbox и Button, Listbox заполняется данными из ссылки на ObservableCollection во ViewModel, которая получает их из сервиса хранящего эти данные. Button при нажатии должна очистить Listbox и заполнить его новыми данными. Model имеет ссылку на ObservableCollection из сервиса и представляет из себя только один метод который будет очищать данные в ObservableCollection и сообщать сервису о том что их надо заново сформировать и добавить в ObservableCollection.

Тоесть:
Нажатие кнопки => ViewModel вызывает в модели команду очистить список и заполнить его => Модель очищает список и просит чтоб сервис его заполнил => В ObservableCollection к которой прибинжен Listbox срабатывает уведомление об изменении коллекции и Listbox загружает новые данные из нее.

Вопрос: Нужна ли тут модель? Или ее функции может выполнить Viewmodel? Конкретно очистить список и сообщить сервису чтоб он его заполнил.


Второй пример
Второй пример:
Есть View на которой расположен Listbox в котором находятся данные о мониторах которые подключены к компьютеру. Эти данные загружает в себя сервис при запуске приложения. ViewModel имеет ссылку на данные из сервиса, View занимается их отображение в ListBox. Задача Listbox состоит не только в отображении данных, но и чтоб при двойном клике по Item в Listbox мы например отключили/включили монитор и поменяли прозрачность его иконки в Listbox.

Тоесть:
Двойной клик по Item в Listbox => ViewModel посылает в Model команду на отключение выбранного из ObservableCollection монитора => Model устанавливает для монитора флаг Activated = false и меняет прозрачность иконки монитора на Listbox (сигнализируя пользователю что монитор отключен), после этого сообщают сервису чтобы он отключил монитор.

Вопрос: Должна ли Model сообщить сервису чтоб он отключил монитор или это должна сделать ViewModel? Или тут вообще нет необходимости в Model, так как ViewModel может сама выполнить эти действия? Может быть что то из этого можно вынести в логику View?


Третий пример
Третий пример:
У нас на View есть CheckBox который при нажатии на него добавляет некоторые параметры в реестр, есть ViewModel которая при нажатии на CheckBox посылает команду в модель о том что нужно добавить параметр в реестр и проверяет успешно ли этот параметр добавился.

Тоесть:
Нажатие на CheckBox => ViewModel посылает команду о добавлении параметра, Model пытается добавить параметр в реестр и если параметр успешно добавлен то возвращает true, если доабвить не удалось то возращает false => ViewModel проверяет успешно ли добавлен параметр в реестр и устанавливает для CheckBox свойство isChecked в зависимости от полученного результата.

Вопрос: Нужно ли тут использовать Model или для этого используется сервис? Если используется Model, то что она должна в себе содержать? Логику добавления параметров в реестр? Или Model должна обращаться к сервису который будет эту логику содержать и получать от него только результат который потом передаст ViewModel?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.11.2021, 00:10
Ответы с готовыми решениями:

Model в MVVM
Доброго времени суток. Начал изучать MVVM и даже что-то получается сделать, но не могу сообразить, что должно быть в Model? Программа...

MVVM Model
Здравствуйте, у меня возник вопрос что должно хранится в моделе, теорию прочитал, но на практике не понимаю. Конкретно в моем вариант...

MVVM. Общение Model с ViewModel
Занимаюсь проектом WPF, первый раз пробую MVVM-паттерн. Успешно реализовал общение View и ViewModel (бинды, команды), но никак не могу...

132
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
02.11.2021, 22:51  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Угу.
А по ошибке у вас нет мыслей? Что то я не понимаю откуда она вылезла на чистом проекте core 5, в инете ничего толкового нет, переустанавливать пробовал.

Добавлено через 10 минут
А все, разобрался, почему-то отсутствовал языковой пакет
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
03.11.2021, 01:07
xr_Sanya, я вот так переношу данные из List<T> в ObservableCollection<T>. Еще тут используется многопоток, так как асинхронные методы у меня вызываются через менеджер потоков.
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 async Task LoadDrawSystemReportsAsync(DrawReport drawReport)
{
    try
    {
        ProgressDrawSystemReport = true;
 
        Application.Current.Dispatcher.Invoke(() =>
        {
            DrawSystemReports.Clear(); // работа с коллекцией в потоке UI
        });
 
        if (drawReport != null)
        {
            List<DrawSystemReport> drawSystemReports = await _reportDA.GetDrawSystemReportsAsync(drawReport);
 
            if (drawSystemReports.Count > 0)
            {
                foreach (DrawSystemReport ds in drawSystemReports)
                {
                    Application.Current.Dispatcher.Invoke(() =>
                    {
                        DrawSystemReports.Add(ds);
                    });
                }
            }
 
            SelectedDrawSystemReport = DrawSystemReports.FirstOrDefault();
        }
 
        ProgressDrawSystemReport = false;
    }
    catch (Exception ex)
    {
        WindowService.ShowErrorMessage(ex.ToString(), "Ошибка загрузки листов чертежа");
    }
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
03.11.2021, 01:22
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
я вот так переношу данные из List<T> в ObservableCollection<T>.
Если будете использовать синхронизацию привязок и коллекции - код будет работать несколько шустрее.
1
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
03.11.2021, 01:27  [ТС]
Элд Хасп
Сделал вот такую структуру для проекта, разбил как вы говорили
Проект
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
03.11.2021, 01:43
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Сделал вот такую структуру для проекта, разбил как вы говорили
Посмотрел пока просто в браузере.
Пока это пустые папки.
Но почему у вас почти в каждом проекте класс App?
Он же должен быть только в исполняемых проектах.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
03.11.2021, 01:44
xr_Sanya, Для View - тип проекта Приложение WPF, для всего остального - Библиотека классов WPF.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
03.11.2021, 01:47  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
xr_Sanya, Для View - тип проекта Приложение WPF, для всего остального - Библиотека классов WPF.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но почему у вас почти в каждом проекте класс App?
Собственно по этому, я использовал не библиотеку классов WPF, а приложение)
Сейчас поправлю
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
03.11.2021, 16:38  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Пока это пустые папки.
Я создал в репозитории 2 сервиса - сервис настроек приложения и сервис текущего времени. (Модели)
И создал отдельно модель которая должна работать с сервисом настроек приложения и предоставлять эти данные для View
Мне не совсем понятно как это все реализовать, ведь View требуется ObservableCollection, а в сервисе настроек у нас лист. Каким образом модели отображать изменения и вносить их?

Коммиты
Нужные:
f4641c1
cf488d8
9180d24
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
03.11.2021, 18:35
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Каким образом модели отображать изменения и вносить их?
Давайте пойдём для начала классическим путём.
Сделаем реализацию, а потом вы уже будете пытаться её модернизировать.

Начнём реализацию с объявления интерфейса Модели.
VM будет получать этот интерфейс и через него работать с данными.
За одно этот интерфейс будет играть роль ТЗ на Модель, что поможет понять как должен разделяться функционал.

Что нам нужно от Модели?

1) Получение списка мониторов - метод: IEnumerable<MonitorConfiguration> GetMonitors().
Здесь сразу нужно уточнить: Как точно идентифицируется монитор, по каким полям?

2) Состояние мониторов может меняться. Поэтому нужно событие извещающее об изменении состояния монитора;

3) Нужны ли какие-то методы по управлению мониторами? Если нужны, то добавить их в интерфейс.

4) В этот же интерфейс добавить все методы для работы с сервисами настроек и времени. Если у них есть интерфиксы, то просто добавить их в список базовых


В результате мы получим некую морду Модели.
VM будет работать только с ней.
Как там дальше Модель работает с данными (через Сервисы, Репозитории, сама непосредственно) - для VM не интересно.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
03.11.2021, 23:04  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Состояние мониторов может меняться. Поэтому нужно событие извещающее об изменении состояния монитора;
Каким образом это можно релизовать? С помощью Event или INPC если я правильно понимаю? Они должны располагаться в MonitorModel или SettingsService? Если в модели, то как тогда отслеживать то что поменялось в сервисе?
Как мне кажется нужно в сервисе настроек это делать, а модель будет получать уведомление об изменении свойства,а ViewModel будет заново его запрашивать. Но если таких свойств очень много, то на изменение каждого нужно будет прописывать уведомление.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
03.11.2021, 23:49
Цитата Сообщение от xr_Sanya Посмотреть сообщение
С помощью Event или INPC если я правильно понимаю?
Лучше с помощью кастомного события.
В параметрах будет передавать источник события и новое состояние монитора.
Если для логику нужно, то можно и третий параметр - старое состояние монитора.

Цитата Сообщение от xr_Sanya Посмотреть сообщение
Они должны располагаться в MonitorModel или SettingsService?
Пока мы только проектируем общий интерфейс Модели.
Как потом они будет реализоваться - это вторично.
В первую очередь надо создать архитектуру приложения.
И начинаем мы с самых крупных частеq - слоёв View, ViewModel, Model.
Нам нужно задать "средство общения" между Model и ViewModel.
Задав его мы определим архитектур на этом уровне и после этого уже можно будет приступать к более мелким задачам: как в деталях реализовывать эту архитектуру.

Добавлено через 3 минуты
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Но если таких свойств очень много, то на изменение каждого нужно будет прописывать уведомление
Важны те которые влияют на состояние Модели.

Основная задача, как я понял - это наблюдение за мониторами.
Состояние монитора отражается в типе MonitorConfiguration.
На не нужно следить за каждым свойством MonitorConfiguration.
У нас общее событие на изменение состояния MonitorConfiguration.

Какие могут быть изменения у коллекции MonitorConfiguration?
За чем вы там наблюдали?
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 04:44  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
За чем вы там наблюдали?
поля IsActive и ColorConfiguration как пример. Другой сервис может поменять цветовую конфигурацию монитора(в моей программе это меняется от установленного пользователем времени), а IsActive может быть изменено из ViewModel(тоесть мы монитор можем отключить и включить кнопкой на View)

Добавлено через 2 минуты
Тоесть я понимаю что нужно создать Event который будет передавать изменённые поля в MonitorsModel из SettingsService.
Как тогда модель будет знать какие именно поля нужно обновить? Ведь мы передаем значения? Или передаем сразу новый экземпляр класса MonitorConfiguration с изменными полями?

Добавлено через 4 часа 49 минут
Создал отдельный проект, чисто для этой темы Репозиторий
Сделал базовую структуру проекта, добавил нужные модели, прописал необходимые методы.

Вопрос как связать данные модель с вью моделью остается. Конкретно MonitorsModel как связать с вью моделью чтобы она обновляла данные о мониторах. Ну и сами модели я тоже не уверен что должны быть такими.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 08:24
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Ведь мы передаем значения? Или передаем сразу новый экземпляр класса MonitorConfiguration с изменными полями?
Давайте немного по теории сначала.

Чем занимается у нас Модель?
Наблюдением и управлением Мониторами.
Для управления Монитором у нас в Модели должна быть Бизнес сущность являющаяся отражением физического устройства.
Бизнес Сущность должна быть инкапсулирована и взаимодействие с Моделью происходит посредством отражения этой Бизнес Сущности на тип не связанный с Бизнес Логикой.

Вот ваш тип MonitorConfiguration - это и есть тип отражающий Бизнес Сущность Модели.
Бизнес сущность у вас реализована в виде различных сервисов, то есть какого-то конкретного объекта отражающего физический монитор у вас нет.
Мне, кажется, это крайне неудобным и запутанным.
Но если вам удобны эти сервисы - то делайте так.

Дальше.
Изменилось состояние устройства. Это изменение отразилось на Бизнес Сущность Модели.
Как конкретно это произошло, нас пока не интересует.
Но Модели теперь надо как-то уведомить своих потребителей об изменении состояния.
Сделать это можно только посредством события.

Можно сделать событие, уведомляющее об изменении состояния устройства или уведомляющее об изменении какой-то его характеристики.
В первом случае в событии сообщается какое устройство изменилось и, если надо, какие-то доп. параметры изменения.
Такое событие реализуется на уровне Модели и в параметрах его передаётся DTO.
Во втором случае нужно уже уведомлять об изменении определённых характеристик у определённого устройства.
Следовательно событие это должно быть реализовано на уровне отражения устройства.
В этом случае получение DTO отражающего Бизнес Сущность будет уже мало.
Надо будет получать полноценные Модели для каждого устройства и подписываться на события каждой из них.

Второй вариант имеет смысл, если устройство требует сложного управления, имеет множество характеристик и т.д,
Этот вариант значительно сложнее, но когда такой сложный объект приходится прибегать к нему.

В вашем случае, на мой взгляд, достаточно будет пойти по первому варианту.
То есть Модель будет присылать DTO отражающий всё состояние Монитора.
А какие в нём изменились данные будет уже определять потребитель.
Свойств не так много и это не шибко сложно, тем более, что может одновременно измениться несколько характеристик.
Можно так же о каких-то существенных изменениях сообщать через дополнительный параметр-действие в событии.
Это типа: подключение нового монитора, отключение монитора и т.д.

Добавлено через 19 минут
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Сделал базовую структуру проекта, добавил нужные модели, прописал необходимые методы.
Добавьте еще проект Coommon под библиотеку типов используемых в нескольких слоях.
Тип проекта "Библиотека классов WPF".
В эту библиотеку перенесите классы команд и реализации INPC.

Цитата Сообщение от xr_Sanya Посмотреть сообщение
Вопрос как связать данные модель с вью моделью остается.
Выше чуток объяснил.

Более детально.
В библиотеке Common добавьте папку Модель.
В ней будут классы используемые Моделью, но которые должны быть видны вне неё.
В папку добавьте ваш DTO MonitorConfiguration.
Он должен отражать ВСЕ требуемые вам характеристики монитора.

Потом в папку добавляете интерфейс IMonitorsModel.
В этом интерфейсе прописывает все члены необходимые для работы с мониторами.
Как минимум метод возвращающий все мониторы, событие уведомляющее об изменении монитора.
Если предусматривается управление мониторами, то методы для этого управления.
Возможно метод получения состояния определённого монитора.
Ну и т.д. - вам виднее что нужно.

Добавлено через 1 минуту
И уже через интерфейс VM будет связываться с Моделью и поддерживать актуальное состояние своих свойств.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 12:30  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
событие уведомляющее об изменении монитора.
Перенес файлы как вы сказали, добавил события Коммит

События на уведомлению об изменении со стороны ViewModel есть, а если поменялись характеристики мониторов не из ViewModel?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 14:27
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Перенес файлы как вы сказали, добавил события Коммит
Уже чё-то похоже на правду.
Сейчас сделаю изменения и покажу здесь, что стоит исправить.

Добавлено через 12 минут
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using Common.Entities;
using System;
using System.Collections.Generic;
 
namespace Common.Interfaces
{
    public interface IMonitorModel
    {
        // Нужно в параметрах передавть данные начимые для события
        // В именеи события не бывает приставки "On". Она используется для обработчиков события.
        // Entity - тоже лишнее. Не несёт никакой смысловой нагрузки.
        //event EventHandler<EventArgs> OnMonitorEntityChanged;
 
        // Одного события достаточно.
        //event EventHandler<EventArgs> OnMonitorsCollectionChanged;
 
        event EventHandler<MonitorChangedArgs> MonitorChanged;
        void ActivateMonitor(int index);
        void ChangeColorConfiguration(int index);
        void DeactivateMonitor(int index);
        void DeleteMonitor(int index);
        MonitorConfiguration GetMonitor(int index);
        IEnumerable<MonitorConfiguration> GetMonitors();
        void RefreshMonitors(int index);
    }
 
    /// <summary>Дейсствия ставшие причиной изменения сотояния монитора.</summary>
    public enum MonitorChangedEnum
    {
        Add,
        Activate,
        ChangeColor,
        Deactivate,
        Delete
    }
 
    /// <summary>Класс аргументов события MonitorChanged.</summary>
    public class MonitorChangedArgs : EventArgs
    {
        public MonitorConfiguration NewValue { get; }
        public MonitorConfiguration OldValue { get; }
        public MonitorChangedEnum Action { get; }
 
        public MonitorChangedArgs(MonitorConfiguration newValue, MonitorConfiguration oldValue, MonitorChangedEnum action)
        {
            NewValue = newValue;
            OldValue = oldValue;
            Action = action;
        }
    }
}
Цитата Сообщение от xr_Sanya Посмотреть сообщение
События на уведомлению об изменении со стороны ViewModel есть, а если поменялись характеристики мониторов не из ViewModel?
Событие - вызывается объектом, а не его потребителем.
Поэтому нет разницы из-за каких действий изменилось состояние Модели.

Добавлено через 54 секунды
xr_Sanya, и просьба - добавляйте минимальные теги XML документации для всех типов и их членов.
Вам понятно, что для чего , а мне нет.

Добавлено через 58 минут
xr_Sanya, уточняю на всякий случай: код показанный мною разложите по разным файлам.
В одном файле код только одного типа.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 15:23  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В одном файле код только одного типа.
Хорошо, я дал вам доступ на всякий к репозиторию

Добавлено через 54 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
добавляйте минимальные теги XML документации для всех типов и их членов
Добавил.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Уже чё-то похоже на правду
Поменял как вы сказали, но всеравно не до конца понимаю как это должно работать.
Пометил в коде с помощью TODO моменты в которых не разобрался, в основном все теже вопросы по взаимодействию модель модель и модель вью модель.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 16:03
xr_Sanya, на пару часов занят.
Потом посмотрю, что в проекте.

Цитата Сообщение от xr_Sanya Посмотреть сообщение
не до конца понимаю как это должно работать
Пока строится уровень абстракций задающий архитектуру приложения, вам это не привычно и не понимаете как он дальше будет связан с реализаций.
Если Интерфейс всё Ок, то начнём реализовывать Модель.
Там станет понятнее.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 16:21  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
вам это не привычно
Это да, я раньше писал на LUA и SQF, SQS и не сталкивался с таким. Шарп было тяжело осваивать, а архитектурные паттерны вообще меня подгружают
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.11.2021, 20:18
xr_Sanya, я смотрю вашу реализацию - вам нигде не нужно старое состояние монитора.
Тогда из параметров события его лучше убрать.

Цитата Сообщение от xr_Sanya Посмотреть сообщение
Пометил в коде с помощью TODO моменты в которых не разобрался
C#
82
83
84
85
86
87
88
89
90
91
        /// <summary>
        /// Удаляет все элементы в таблице Monitors из SettingsService, а потом заново заполняет таблицу
        /// </summary>
        public void RefreshMonitors()
        {
            SettingsModel.Source.Monitors.Clear();
            SettingsModel.Source.LoadSettings();
 
            //TODO: Тут должно же быть какоето событие сигнализируещее об изменении таблицы?
        }
Здесь возможны два подхода.
1) Сообщаете об удалении всех старых и потом по одному добавляете все новые монитры.
2) Сравниваете старый список с новым, определяете изменения, и посылаете по каждому изменению удалён, добавлен, изменён.

Добавлено через 2 минуты
Цитата Сообщение от xr_Sanya Посмотреть сообщение
C#
41
42
            //TODO: Не уверен как передать новую конфигурацию, нужно в oldValue передать текущее значение?
            //TODO: А в newValue новый экзмепляр класса с измененным полем?
Если вам для инфраструктуры не важно старое состояние, то его нужно удалить из события.
Я уже сделал соответствующую фиксацию.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.11.2021, 20:23  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Здесь возможны два подхода.
Только куда их добавлять?) У модели должно быть отражение Monitors из SettingsService? Если да, то как правильно отследить что таблица в SettingsService изменилась?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2021, 20:23

MVVM биндинг view в model
Я новичок, пытаюсь написать приложение UWP согласно паттерну MVVM В общем, в модели должен быть список экземпляров класса. В классе...

Бизнес-логика
Подскажите, как решить следующую проблему: Занимаюсь по пособию, и возникла ошибка. Код из C# public class DataCommands { ...

WPF MVVM - Transfer Data to Model
Всем привет, уважаемые. Есть два этапа: 1. Переношу коллекцию ObservableCollection из VM в Model. 2. А затем из Model в другую VM. ...

Каково назначение папки Model в MVVM
Просто я к тому, что все классы относящиеся к логике будут иметь пространство имён начинающееся с Model, это нормально вообще? Или не всю...

MVVM. Получение данных объекта по сети - в model или во viewmodel?
Здравствуйте! Вникаю в паттерн mvvm, прочитал\посмотрел кучу учебных материалов, и если честно, в голове каша уже. Мне понравился своей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru