6 / 6 / 0
Регистрация: 21.05.2016
Сообщений: 18
|
||||||||||||||||
1 | ||||||||||||||||
WPF Программное заполнение коллекции и отображение в DataGrid с использованием MVVM22.07.2019, 19:11. Показов 3884. Ответов 29
Здравствуйте. Только начинаю вникать в MVVM. Нашел такой пример:
Модель:
0
|
|
22.07.2019, 19:11 | |
Ответы с готовыми решениями:
29
Отображение номеров строк в DataGrid в MVVM Отображение коллекции в DataGrid
WPF MVVM Бинарная сериализация коллекции классов |
![]() 17223 / 12675 / 3323
Регистрация: 17.09.2011
Сообщений: 20,949
|
|
22.07.2019, 21:56 | 2 |
0
|
6 / 6 / 0
Регистрация: 21.05.2016
Сообщений: 18
|
|
22.07.2019, 22:25 [ТС] | 3 |
0
|
![]() 17223 / 12675 / 3323
Регистрация: 17.09.2011
Сообщений: 20,949
|
|
22.07.2019, 22:38 | 4 |
c0d3r, покажите как добавляете
0
|
Модератор
![]() |
|
22.07.2019, 23:00 | 5 |
Пример так себе....
Здесь нет полноценной Модели. Класс Person - это не Модель. Это тип элемента списка.В MVVM коллекция People должна создавать и изменяться в Модели, так как она содержит ДАННЫЕ. А у ViewModel нет полномочий на ИЗМЕНЕНИЕ ДАННЫХ.Если делать полноценное MVVM решение. То надо создать класс Модели. В нём объявить методы для сохранения/чтения коллекции, добавлении/удалении/изменении элементов коллекции, событие (или события) уведомляющее об измени данных. Для View вы выбрали DataGrid - это сложный элемент и не совсем удачный для начального освоения MVVM.Он сам залезает в коллекцию-источник и изменяет её. А для классического MVVM так делать нельзя. Необходимо "развязывать" коллекции Модели и View - это сложно для начинающих. Нужно отлавливать изменения элементов, самой коллекции, синхронизировать их с коллекцией Модели.
1
|
6 / 6 / 0
Регистрация: 21.05.2016
Сообщений: 18
|
|
23.07.2019, 15:11 [ТС] | 6 |
Есть какой либо пример?
У меня пользователь не будет работать с таблицей через интерфейс. Есть метод который парсит данные через селениум и результат сохраняет в коллекцию. В проекте на винформ использовал List<T> для сохранения результата и этот список выводился в datagridview. Теперь переношу проект на wpf и моментально столкнулся с такой задачей. m_people.Add People.Add В коллекцию попадает, но датагрид не реагирует.
0
|
![]() 17223 / 12675 / 3323
Регистрация: 17.09.2011
Сообщений: 20,949
|
|
23.07.2019, 16:48 | 7 |
Я имел в виду полный код хотя бы метода, где производится добавление.
Имею подозрение, что вы привязываете к гриду один экземпляр MyViewModel, а элементы добавляете совсем в другой.
1
|
Модератор
![]() |
|
23.07.2019, 17:04 | 8 |
Походы к созданию View на WPF и WF очень сильно различаются.
На WF решения реализуются в MVC, на WPF - MVVM. Поэтому основной инициатор действий в WF - это контролер, который часто (хоть это и неверно) реализуется в CB формы. А в WPF инициирует действия View и использование CB окна для работы с данными не просто неверно, а чаще всего - ошибка. Посмотрите темы по разделу. Часть примеров я собрал здесь Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]. Если будет время - сделаю на основе вашего кода простую реализацию.
1
|
0 / 0 / 0
Регистрация: 23.07.2019
Сообщений: 1
|
|
23.07.2019, 17:07 | 9 |
Consumers today have short attention spans so companies have very limited time to convince prospects that their products are worth the consideration. This is where a solid logo design comes in which grabs viewers’ attention and communicate the core values of the company in a unique and creative way.
0
|
6 / 6 / 0
Регистрация: 21.05.2016
Сообщений: 18
|
|
23.07.2019, 18:12 [ТС] | 10 |
Да, действительно, глупо конечно), но как тогда добавить элемент в коллекцию не вызывая новый экземпляр вм? Я предполагаю, что только так:
Однако пока не понял, как реализовать. Спасибо.
0
|
Модератор
![]() |
|
23.07.2019, 18:18 | 11 |
c0d3r, посмотрите реализацию похожего решения WPF MVVM Template Number One
Я там пошагово в нескольких постах объясняю как и для чего что-то делается.
1
|
Модератор
![]() |
|
23.07.2019, 18:26 | 12 |
c0d3r, вот эта тема тоже показательна Пример реализации WPF+MVVM приложения
Добавлено через 2 минуты Eщё похожая Программное создание item в TreeView MVVM Добавлено через 1 минуту Ещё Datagrid сохранение изменений
1
|
Модератор
![]() |
|||||||||||||||||||||
23.07.2019, 21:58 | 13 | ||||||||||||||||||||
Создаём новое решение с проектом
MVVMTest типа WPF FW.В нём создаём проект CommLibrary типа библиотека классов FW. Эта библиотека типов которые могут быть использованы в любом решении. И в следующем решении можно сделать просто ссылку на эту сборку.Для начала в нём создаём два класса и один интерфейс
ModelLibrary типа Библиотека FW. В этой библиотеке будут типы для описания данных Модели. Пока это будет только один класс Person . Так как этот тип будет использоваться во всех проектах решения, в том числе в View, то делаем его производным от OnPropertyChangedClass . Так же с большой долей вероятности потребуется сравнение и копирование экземпляров этого класса. Поэтому добавляем интерфейсы ICopy<Person> , IComparable<Person> , IComparable
1
|
Модератор
![]() |
||||||||||||||||
23.07.2019, 22:47 | 14 | |||||||||||||||
Теперь создаём проект для Модели
Model так же типа Библиотека FW.Добавляем ссылки на проекты CommLibrary и ModelLibrary .В нём создаём класс для Модели ModelMVVMTest .В первую очередь надо создать методы сохранения и загрузки данных. Самое простое решение использовать для этого сериализацию/десериализацию данных. Для этого нужны классы с атрибутом [Serializable] . Добавляем этот атрибут в класс Person
Person будут другие данные. Поэтому создадим класс-контейнер, в котором список Person будет свойством. Если появятся другие данные, то добавим в это класс ещё свойства.
На сегодня всё. Будет время продолжу.
1
|
Модератор
![]() |
||||||||||||||||||||||||||
24.07.2019, 09:50 | 16 | |||||||||||||||||||||||||
Теперь в Модель надо добавить методы для работы с данными.
Чтобы не делать файл класса необъятным разобьём класс на несколько файлов. В одном будет сохранение/загрузка данных, в другом методы для работы с данными. Для этого в объявление класса добавляем слово partial .Что нам нужно для работы с данными? Для начала хватит методов:
ConsoleDebug типа Консольное приложение FW. В нём добавляем ссылки на проекты CommLibrary , ModelLibrary и Model . Для вывода в строку добавляем в класс Person переопределение метода ToString()
1
|
6 / 6 / 0
Регистрация: 21.05.2016
Сообщений: 18
|
|||||||||||
24.07.2019, 10:27 [ТС] | 17 | ||||||||||
0
|
Модератор
![]() |
|
24.07.2019, 11:49 | 18 |
Person - это тип для описания одного элемента. Закладывать в него "знания" о списке элементов и методах работы с ним - моветон.Это касается не только WPF, а ООП в целом. Прочитайте за SOLID .
0
|
Модератор
![]() |
|
24.07.2019, 11:57 | 19 |
Вам, наверное, такие сложности кажутся излишними. Но это связанно с тем, что создаётся очень простое решение работающее локально на одном компе. И цель этого решения
Получение навыков для правильного создания WPF приложения . Теоретически Модель должна работать независимо от View и, в том числе она может работать на удалённом сервере. В таком случае класс Person Модели будет относится к бизнес логике и у View и VM не будет доступа к нему. Обмен данными между Model и VM будет происходить через потоки сериализации/десериализации. В основном сейчас используется JSON, но XML тоже допустим и почти не отличается (по методам работы с сериализацией).
0
|
Модератор
![]() |
|
24.07.2019, 12:00 | 20 |
Для начала (в виду вашего опыта) будем создавать простое решение, но создавать его будем правильно.
Потом, если будет желание и "потянете", разобьём его на отдельно работающие Model и View. Но для этого потребуются уже знания по созданию клиент-сервер приложений.
1
|
24.07.2019, 12:00 | |
Помогаю со студенческими работами здесь
20
Программное создание элемента XAML UWP MVVM Отображение данных в одном datagrid при клике в другом datagrid
Mvvm datagrid ef Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |