Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468

Приложение MVVM. Диалог добавления/редактирования товара: получение данных, вызов, взаимодействие с VM и прочее

09.03.2023, 14:42. Показов 9338. Ответов 207
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В этой теме обсуждается только вопросы по реализации Диалога редактирования товара и связанных с этим действиях .
Основная тема: Приложение MVVM. VMs и навигация
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я изначально предлагал другой вариант, гораздо проще реализуемый:
Просто в одном варианте задания были требования по реализации редактирования с помощью контекстного меню. Вот поэтому я и заинтересовался. К тому же хотелось получить какой-то опыт работы с ним

Добавлено через 3 минуты
Меня интересует маппер. Он инициализирует свойства составного типа такие как Manufacturer?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.03.2023, 14:42
Ответы с готовыми решениями:

Приложение MVVM. Контекстное меню (удаление, редактирование) для элемента (Товара) в ListBox
Да, для добавления будет отдельная кнопка где-то сверху. А для редактирования давайте создадим контекстное меню для каждого элемента. Хотя...

Взаимодействие баз данных с MVVM
Мне посоветовали завернуть роботу с базами в класс сервис и работать с ней через биндинги вьюшки, но дело в том что я не совсем понимаю что...

Взаимодействие с базой данных в MVVM
У меня есть класс, в котором реализована логика взаимодействия с БД, все таблицы хранятся в этой структуре в памяти. Этот класс...

207
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
16.03.2023, 20:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от INexteR Посмотреть сообщение
Но тогда при каждом подобном действии придется писать новый класс. Не избыточно ли это?
Ну, а кто сказал, что всегда пишется "идеальный" код?
Я же даже про наше основное приложение ни раз писал "Это идеальная реализация для обучения".
В практических приложениях многие углы срезаются.
Но надо знать как делается правильно, чтобы понимать что можно срезать, а что нет.

В данном случае можно сказать так: "Behavior - это более правильная реализация с точки зрения ОПП, SOLID. Она более универсальна и позволят использовать её как библиотечный элемент. Но в данном случае мне нужно одноразовое локальное решения, поэтому я предпочёл костыль в CB с более коротким кодом."
1
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
16.03.2023, 20:49  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ну, наверное, неспроста я использовал другое событие?
Я это подметил. Мне просто интересно, почему на один элемент получается получить ссылку, а на другой нет
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
16.03.2023, 20:55
Цитата Сообщение от INexteR Посмотреть сообщение
Мне просто интересно, почему на один элемент получается получить ссылку, а на другой нет
Потому что один визуализируется до Loaded, а другой нет.
Какая ещё может быть причина.
Честно говоря не пойму даже почему в Loaded вы смогли получить PART_EditableTextBox.
По идее его тоже не должно быть. Проверю сейчас.

Добавлено через 2 минуты
Проверил - оба null
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
16.03.2023, 21:35  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Потому что один визуализируется до Loaded, а другой нет.
А у меня в LayoutUpdated даже на первом поиске toggleButton вылетает NullReferenceException

Добавлено через 13 минут
Я что-то не пойму, VisualTree что ли всегда null выдаёт? На самом деле визуальное дерево создано в шаблоне в xaml. И до компоновки, и после нее это свойство остается пустым

Добавлено через 9 минут
В общем подскажите мне пожалуйста, как скрыть/удалить пункты меню в зависимости от прав пользователя. Писать однотипные DataTemplate с различием в одном лишь наборе пунктов меню не хочу. Писать триггеры в шаблоне тоже не хочу
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
16.03.2023, 21:42
Цитата Сообщение от INexteR Посмотреть сообщение
даже на первом поиске toggleButton вылетает NullReferenceException
На первом - да.
Но на каком-то выдаст правильный результат.

По нормальному нужно переопределять OnApplyTemplate(). Но это возможно только в Custom Control.

Добавлено через 2 минуты
Цитата Сообщение от INexteR Посмотреть сообщение
как скрыть/удалить пункты меню в зависимости от прав пользователя.
Для начала сделайте отключение пунктов в зависимости от прав, через CanExecute команды.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
17.03.2023, 07:23  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для начала сделайте отключение пунктов в зависимости от прав, через CanExecute команды.
Мне нужно вообще не отображать эти элементы. Чтобы их "не было" для определенного пользователя
0
 Аватар для Andrey-MSK
3388 / 2274 / 388
Регистрация: 14.08.2018
Сообщений: 7,693
Записей в блоге: 4
17.03.2023, 08:26
Цитата Сообщение от INexteR Посмотреть сообщение
я не считаю cb чем-то плохим. В данном случае код оказывает эффект чисто на элементы управления и он не в курсе о каких-то конкретных данных
Я написал этот класс один раз и потом просто добавляю его в DataGrid тремя строками XAML
XML
1
2
3
<i:Interaction.Behaviors>
    <local:ScrollIntoViewBehavior/>
</i:Interaction.Behaviors>
И элемент функционирует так как мне надо, и не надо париться что там происходит с данными, добавляются они, удаляются, модифицируются. В VM просто указываем SelectedItem и всё, элемент промотался до выделенной позиции списка.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
17.03.2023, 09:21
Цитата Сообщение от INexteR Посмотреть сообщение
Мне нужно вообще не отображать эти элементы. Чтобы их "не было" для определенного пользователя
Я это понял.
"Исчезание" неактивных пунктов - это вторая задача, решаемая стилем MenuItem. Задаётся зависимость Visibility от IsEnabled.
Вы постоянно пытаетесь думать "от View", а рассуждать нужно "от Модели".
Модель знает что какие-то пункты в GUI видимы или нет? Нет, конечно. Модели это "по барабану".
Она просто разрешает или нет выполнение каких-то методов для определённых категорий пользователей.
Поэтому сначала нужно реализовать деактивацию команд VM в зависимости от прав.
А как потом будут использованы эти состояния команд - "вторичный" вопрос.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
17.03.2023, 13:53  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Она просто разрешает или нет выполнение каких-то методов для определённых категорий пользователей.
Может в модели сделать свойства, такие как CanAdd, CanDelete? Далее их спроецировать в VM

Добавлено через 1 минуту
Просто не понимаю, разве это будет правильно, если в модели не будет этих свойств, а в VM они появятся
0
 Аватар для Andrey-MSK
3388 / 2274 / 388
Регистрация: 14.08.2018
Сообщений: 7,693
Записей в блоге: 4
17.03.2023, 14:00
Цитата Сообщение от INexteR Посмотреть сообщение
Просто не понимаю, разве это будет правильно, если в модели не будет этих свойств, а в VM они появятся
А почему это должно быть не правильно? VM проецирует модель на View, но одновременно с этим может иметь кучу своих свойств и методов для обработки данных модели в обе стороны.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
17.03.2023, 14:11  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А почему это должно быть не правильно?
Потому что вот
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это идеальная реализация для обучения
0
 Аватар для Andrey-MSK
3388 / 2274 / 388
Регистрация: 14.08.2018
Сообщений: 7,693
Записей в блоге: 4
17.03.2023, 14:19
INexteR, Ну если идеальная, то тогда и в CB должно быть пусто, и модель с VM должны быть типа NET Standart и еще много чего
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
17.03.2023, 14:23  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
типа NET Standart
как понять net standard
0
 Аватар для Andrey-MSK
3388 / 2274 / 388
Регистрация: 14.08.2018
Сообщений: 7,693
Записей в блоге: 4
17.03.2023, 14:28
Цитата Сообщение от INexteR Посмотреть сообщение
как понять net standard
Так и понимать, это тип библиотеки которая работает на любой платформе, которая поддерживается в NET. В этом типе существует много ограничений, но она гарантировано заработает на любой платформе без внесения каких-либо изменений.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
17.03.2023, 14:56
Цитата Сообщение от INexteR Посмотреть сообщение
если в модели не будет этих свойств, а в VM они появятся
Конечно.

Более детально зависит от БЛ.
Если права однозначно определяются ролью (а у нас так), то дополнительные свойства/методы в Модели для их получения будут избыточны.
Состояние команд VM будет зависимым от роли получаемой из текущего пользователя - и этого достаточно.

Добавлено через 7 минут
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
в CB должно быть пусто,
В "идеальном" WPF - согласен.
В "идеальном" MVVM - паттерн никаких требований на этот счёт не содержит.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
модель с VM должны быть типа NET Standart
Модель - да, поскольку она платформонезависима.
VM - нет. Она платформа зависима. Например для WPF и UWP требуется в многопотоковом приложении разные реализаци INPC и команд, по разному реализуется работа с INCC (синхронизация коллекций).

Оно как бы можно сделать универсальную VM, но там будет много кода который в рантайм будет определять платформу и переподключать требуемые типы.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
и еще много чего
Ну, это да.
Поэтому "идеальность" только в рамках текущей задачи.

Добавлено через 1 минуту
Цитата Сообщение от INexteR Посмотреть сообщение
как понять net standard
UWP совместима со Standart 2.0 и ограничено с 2.1.
Framework, Core (в том числе .Net 5+) к UWP не подключатся.
1
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
17.03.2023, 19:55  [ТС]
Элд Хасп, я написал конвертер, который формирует ContextMenu. Это позволительно?
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 object? Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var viewModel = (IAuthorizationViewModel)value;
    if (viewModel.CurrentUser is IUser user)
    {
        var contextMenu = new ContextMenu
        {
            Style = (Style)Application.Current.Resources["ctrlStyle"]
        };
        Func<MenuItem, int> add = contextMenu.Items.Add;
 
        var updateItem = new MenuItem { Header = "Редактировать" };
        updateItem.Click += ProductsViewHelper.OnUpdateProductClick;
        var copyItem = new MenuItem { Header = "Копировать" };
        copyItem.Click += ProductsViewHelper.OnCopyProductClick;
        var deleteItem = new MenuItem { Header = "Удалить" };
        deleteItem.Click += ProductsViewHelper.OnDeleteProductClick;
 
        switch (user.Role.Rights)
        {
            case Rights.Adding:
                add(copyItem);
                break;
            case Rights.Updating:
                add(updateItem);
                break;
            default:
                add(updateItem);
                add(copyItem);
                add(deleteItem);
                break;
        }
        return contextMenu;
    }
    return null;
}
XML
1
<Grid x:Name="root" ContextMenu="{Binding Authorization, Source={StaticResource locator}, Converter={x:Static cvt:ContextMenuConverter.Instance}}">
Однако все равно этот конвертер будет вызываться для каждого элемента, это огорчает
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
17.03.2023, 20:02
Цитата Сообщение от INexteR Посмотреть сообщение
Однако все равно этот конвертер будет вызываться для каждого элемента, это огорчает
Естественно.
Контекстное меню обычно так и создаются - отдельный экземпляр для каждого элемента его вызывающего.
Для списка можно задать экземпляр в ресурсах и обращаться к нему.
Такое допустимо, поскольку, Контекстное меню будет вызываться одновременно только у одного элемента.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
17.03.2023, 20:18  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Естественно.
Ну тут я не спрашиваю, а утверждаю. В таком случае не пришлось писать ненужный триггер в шаблоне, но все равно выполняется много лишней работы, так как она одинаковая для каждого элемента. Жаль, что нельзя на сам шаблон повлиять

Добавлено через 1 минуту
Мне бы хотелось услышать вашу оценку для этого решения
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
17.03.2023, 20:25
Цитата Сообщение от INexteR Посмотреть сообщение
Это позволительно?
Позволительно. Но зачем?
Раз уж нужно создать свой UI элемент, создайте CustomControl из ContextMenu.
Пусть принимает данные в DataContext или в какое-то кастомное свойство и производит самонатсройку.

Добавлено через 1 минуту
Цитата Сообщение от INexteR Посмотреть сообщение
Мне бы хотелось услышать вашу оценку для этого решения
Уже:
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для списка можно задать экземпляр в ресурсах и обращаться к нему.
Такое допустимо, поскольку, Контекстное меню будет вызываться одновременно только у одного элемента.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
17.03.2023, 20:43  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для списка можно задать экземпляр в ресурсах и обращаться к нему.
Раз так, то можно при загрузке это самое контекстное меню настроить один раз, допустим, удалить лишние пункты, и тогда не нужно будет в конвертере для каждого пункта делать однообразную работу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.03.2023, 20:43

Создание базы данных с функциями ввода, вывода, редактирования, удаления или добавления данных
Задание заключается в создании базы данных с функциями ввода, вывода, редактирования, удаления или добавления данных. Написал программу и...

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

Форма для добавления, редактирования, удаления данных
Уважаемые форумчане, подскажите, как лучше сделать и правильнее! В форме &quot;Органы исполнительной власти&quot; в данной &quot;БД&quot;...

Пример добавления, удаления и редактирования данных в БД *.mbd
нужен пример добавления, удаления и редактирования данных в БД *.mbd через классы OleDbDataAdapter, OleDbConnection, DataSet. ...

Использование возможностей добавления, редактирования и удаления необходимых записей в базы данных
помогите дополнить код пожалуйста public partial class Form1 : Form { // здесь отмечаются переменные и методы внутри класса формы...


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

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru