Форум программистов, компьютерный форум, киберфорум
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. Показов 16212. Ответов 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
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
03.11.2021, 01:43
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Сделал вот такую структуру для проекта, разбил как вы говорили
Посмотрел пока просто в браузере.
Пока это пустые папки.
Но почему у вас почти в каждом проекте класс App?
Он же должен быть только в исполняемых проектах.
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru