powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF MVVM построение модели
5 сообщений из 5, страница 1 из 1
WPF MVVM построение модели
    #38781557
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Пишу первое приложение на WPF с применение MVVM. С view и её связью с viewmodel мне ясно.
У меня возник вопрос построения модели.

Что у меня есть:

Данные:
Есть список заказов. Для его получения из БД есть ХП.
Каждый заказ содержит список деталей. Для его получения из БД есть ХП.
Каждая деталь содержит показатели, которые будут изменятся в БД при помощи ХП. Для их получения из БД есть ХП.

Приложение должно состоять из трёх вьюшек:
ф.1) Отображение списка заказов и выбор заказа
ф.2) Отображение списка деталей выбранного в ф.1. заказа
ф.3) Работа с показателями детали выбранной в ф.2

Вопрос 1:
Т.е. мне надо хранить список заказов, выбранный заказ, список деталей и выбранную деталь и т.д. Как правильно организовать модель? Сколько должно быть моделей?
Если модель одна, то получается что для каждой вьюшки у меня она будет дублироваться?

Вопрос 2:
Так же есть ещё одна форма, которые осуществляют работу с показателями детали, выбранной в п.2. Выход на неё может произойти из ф.2 и ф.3. В зависимости откуда я вышёл на неё - должен меняться список элементов на форме (скрыть/отобразить опр. кнопки).

Вопрос 2:
Как правильно передавать параметр откуда от формы к форме?


У меня были такие мысли:
1) Все данные хранить в одной модели статического типа.
2) Данные о выбранном заказе, детали, ... хранить в статическом классе. И при создании вью из него брать номер заказа, детали и грузить необходимые данные.
Что верно, что - нет?


Пишу с использованием MVVM Light Toolkit (стараюсь по крайней мере его использовать).
Страницы все создал в виде Page. При загрузке приложения - создаю весь список страниц и кидаю их в коллекцию. Переключение страниц происходит при помощи статичного класса.

Некоторые части того, что есть сейчас:


Переключалка окон:
Код: 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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
   public static List<Page> pages = new List<Page>();
        private static TerminalWindow _windowMain;
        public TerminalWindow()
        {
            Terminal.ReadFromIni();
            InitializeComponent();
            _windowMain = this;

            Terminal.Logger.Debug("Создание страниц");
            var v_order_headers = new V_OrderHeaders();
            var v_order_details = new V_OrderDetails();
            var v_weight_picking = new V_WeightPicking();
            var v_weights_delete = new V_WeightsDelete();

            //добавляем
            pages.Add(v_order_headers);
            pages.Add(v_order_details);
            pages.Add(v_weight_picking);
            pages.Add(v_weights_delete);
            Terminal.Logger.Debug("Страницы созданы");

            Terminal.Logger.Debug("Переключение на страницу V_OrderHeaders");
            SwitchPage(typeof(V_OrderHeaders));
            Routine();
        }
        public static TerminalWindow WindowMain
        {
            get { return _windowMain; }
        }
        public static Page GetPage(Type _type_ofpage)
        {
            return pages.Find(_p => _p.GetType().FullName.Equals(_type_ofpage.FullName));
        }
        private static Stack<Type> BackStack = new Stack<Type>(2);
        private static bool isFirst = true;
        public void SwitchPage(Type _type_ofpage)
        {
            Terminal.Logger.Debug("Переключение на страницу " + _type_ofpage.Name);
            if (isFirst)
            {
                Switch(_type_ofpage);
                isFirst = false;
                return;
            }
            BackStack.Push(SwitcherFrame.Content.GetType());
            BackStack.TrimExcess();
            Switch(_type_ofpage);
        }
        public void SwitchPageBack()
        {
            //var t = BackStack.Pop();
            if (BackStack.Count > 0)
                Switch(BackStack.Pop());
            //SwitchPage(BackStack.Pop());
        }
        private void Switch(Type _type_ofpage)
        { SwitcherFrame.Navigate(pages.Find(_p => _p.GetType().FullName.Equals(_type_ofpage.FullName))); } 

        public static Type LastPageType
        {
            get
            {
                if (BackStack.Count > 0)
                    return BackStack.Peek();
                return null;
            }
        }





Создание окна списка заказов.
Зачем Load, Unload: формы могут подписываться на события, создавать доп. потоки (для работы с оборудованием), которые надо запускать/останавливать.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    public partial class V_OrderHeaders
    {
        private readonly VM_OrderHeaders _vm = new VM_OrderHeaders();
        public V_OrderHeaders()
        {
            InitializeComponent();
            Initialized += Load;
            Unloaded += UnLoad;
            DataContext = _vm;
        }
        void Load(object sender, EventArgs e)
        {
            _vm.Load();
        }
        void UnLoad(object sender, RoutedEventArgs e)
        {
            _vm.UnLoad();
        }
    }

...
Рейтинг: 0 / 0
WPF MVVM построение модели
    #38783655
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.,
авторТ.е. мне надо хранить список заказов, выбранный заказ, список деталей и выбранную деталь и т.д. Как правильно организовать модель? Сколько должно быть моделей? Если модель одна, то получается что для каждой вьюшки у меня она будет дублироваться?
для каждой сущности нужно создать отдельный класс в модели данных. В модели представления можно использовать обёртку, если каждый элемент должен иметь какой то функционал или просто хранить их в списках.
Если в разных моделях представления у вас списки этих деталей и заказов одинаковые, то имеет смысл создать базовый класс, который будет включать эти списки.
Выделенный элемент это просто поле модели представления.
авторТак же есть ещё одна форма, которые осуществляют работу с показателями детали, выбранной в п.2. Выход на неё может произойти из ф.2 и ф.3. В зависимости откуда я вышёл на неё - должен меняться список элементов на форме (скрыть/отобразить опр. кнопки).для списков есть интерфейс ICollectionView через который можно обновлять список элементов на форуме, фильтровать, сортировать и так далее. но сути вопроса я не очень понял.
авторКак правильно передавать параметр откуда от формы к форме?через модель представления. Вы нажали кнопку на форуме, через ICommand выполняется метод в модели представления, который будет менять значение в целевой модели.
...
Рейтинг: 0 / 0
WPF MVVM построение модели
    #38783691
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автордля каждой сущности нужно создать отдельный класс в модели данных. В модели представления можно использовать обёртку, если каждый элемент должен иметь какой то функционал или просто хранить их в списках.
Если в разных моделях представления у вас списки этих деталей и заказов одинаковые, то имеет смысл создать базовый класс, который будет включать эти списки.
Выделенный элемент это просто поле модели представления.
Т.е. в данной ситуации у меня должно быть три модели: Заказ, деталь заказа, показатель детали. Эти три сущности не обладают каким-то дополнительными функциями. Т.е. у меня получается три модели, которые хранят в себе лишь ObservableCollection, так?
И, как я понял из вашего комментария, я могу создать четвёртый класс, который будет хранить в себе объединение трёх вышеописанных. Я правильно понял?

авторавторТак же есть ещё одна форма, которые осуществляют работу с показателями детали, выбранной в п.2. Выход на неё может произойти из ф.2 и ф.3. В зависимости откуда я вышёл на неё - должен меняться список элементов на форме (скрыть/отобразить опр. кнопки).для списков есть интерфейс ICollectionView через который можно обновлять список элементов на форуме, фильтровать, сортировать и так далее. но сути вопроса я не очень понял.
Я не очень понял связь между ICollectionView с самими формами.
Опишу задачу по-другому: Мне надо знать из какой формы я пришёл на ф.3. И в зависимости от этого, принимать решение об отображении некоторых элементов. Сейчас я в своём базовом окне реализовал свойство LastPage. Получается я о предидущей форме узнаю не через передаваемый параметр, а при помощи обращения к свойству LastPage базового окна. Мне кажется что это не совсем верная стратегия.

авторКак правильно передавать параметр откуда от формы к форме?через модель представления. Вы нажали кнопку на форуме, через ICommand выполняется метод в модели представления, который будет менять значение в целевой модели.[/quot]
Что подразумеваете под целевой моделью?
Я понимаю последовательность "Нажал кнопку"-"выполнение Command"-??? А дальше?
Как мне произвести передачу параметра в другую модель представления? Ведь текущая VM не знает ничего о VM к которой будет совершён переход базовым окном.
...
Рейтинг: 0 / 0
WPF MVVM построение модели
    #38786509
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кто добавит комментариев?
...
Рейтинг: 0 / 0
WPF MVVM построение модели
    #38786631
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.Может кто добавит комментариев?
Я б в таком случае (как и во многих других) использовал б Composite в качестве т. с. горизонтальной структуры приложения (если вертикальной считать слои View, View model, Model и прочие).
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF MVVM построение модели
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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