|
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
|
|||
Приложение MVVM. Диалог добавления/редактирования товара: получение данных, вызов, взаимодействие с VM и прочее09.03.2023, 14:42. Показов 9309. Ответов 207
Метки нет (Все метки)
Добавлено через 3 минуты Меня интересует маппер. Он инициализирует свойства составного типа такие как Manufacturer?
0
|
|||
| 09.03.2023, 14:42 | |
|
Ответы с готовыми решениями:
207
Приложение MVVM. Контекстное меню (удаление, редактирование) для элемента (Товара) в ListBox Взаимодействие баз данных с MVVM
|
|
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
|
||
| 23.03.2023, 07:17 [ТС] | ||
|
Добавлено через 1 минуту А в таком случае будет вызвано перечитывание значения из get? Мне кажется нет
0
|
||
|
Модератор
|
||
| 23.03.2023, 08:37 | ||
|
INexteR, изменил цифровые конвертеры на общий.
И вынес валидацию из сеттеров. Посмотрите фиксацию. Добавлено через 1 минуту Перечитывание возникает после присвоения значения свойства.
1
|
||
|
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
|
||
| 26.03.2023, 15:01 [ТС] | ||
|
0
|
||
|
Модератор
|
||
| 26.03.2023, 17:03 | ||
|
Окно не должно отвечать по функционалу за такие вещи. В данном случае у вас всё сделано "в одной каше", но "по взрослому" Окно разбивается на Регионы. В данном случае, будет выделен регион Списка и в неё Регионы элементов Списка. Контекстное меню - это часть региона элемента списка. Окно ничего не знает о регионе третьего уровня вложенности и не сможет там ничего настраивать. Добавлено через 1 минуту В текущей разметке перенесите Контекстное Меню в ресурсы Шаблона Элемента Товара и попробуйте его настроить.
0
|
||
|
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
|
|
| 31.03.2023, 15:25 [ТС] | |
|
Элд Хасп, Отправка объекта IList с выбранными элементами в ViewModel почему тогда Вы тут ничего против не сказали? Тоже используется обработчик события Loaded
0
|
|
|
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
|
|
| 31.03.2023, 19:33 [ТС] | |
|
Элд Хасп, понятно. Но только в моем случае я не поленился, а попытался избежать ненужной работы, или, как Вы говорите, сэкономил доллар
0
|
|
|
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
|
|
| 02.04.2023, 10:00 [ТС] | |
|
Элд Хасп, а Вы же не объединили обработчик PreviewTextInput с конвертером?
0
|
|
|
Модератор
|
||
| 02.04.2023, 12:42 | ||
|
Мне не приходи в голову как это сделать, чтобы упростить, а не усложнить. Упростить XAML можно но Шарп резко осложнится. Проблема в том, что Binding защищён от изменений и от него нельзя сделать производный класс... Вернее, защищён не он, а его метод ProvideValue и нельзя его переопределить.А информацию об элементе, который использует Binding можно получить только из этого метода. Поэтому придётся делать фактически свой кастомный Binding "с нуля". А это ОЧЕНЬ сложно.
0
|
||
|
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
|
|
| 02.04.2023, 13:51 [ТС] | |
|
0
|
|
|
Модератор
|
||
| 02.04.2023, 13:57 | ||
|
0
|
||
|
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
|
|
| 12.04.2023, 21:20 [ТС] | |
|
Элд Хасп, в этой реализации осталась такая засечка, что на форме авторизации в текстовом блоке статус отображается как значение из перечисления. Тут нужен DictionaryConverter, верно?
Добавлено через 1 минуту И вот я думаю, что хотел бы в следующей реализации испробовать подход с использованием DTO вместо интерфейсов. А также при редактировании я бы не хотел менять сущности целиком, а только свойства Добавлено через 8 минут Мне нужно создать новый проект. И он будет на порядок сложнее, чем тот, что мы делали на демоэкзамен. Сможете помочь с ним? Предметной областью будет являться санаторий. Там уже нужно будет добавлять и редактировать: клиентов, заказы, процедуры и проч. Первой проблемой для меня является создание правильной бд Добавлено через 1 минуту Элд Хасп, первоначально мой путь лежит через раздел баз данных и ADO, верно?
0
|
|
|
Модератор
|
||||
| 12.04.2023, 21:34 | ||||
DictionaryConverter - это один из вариантов конвертера, чтобы делать новый "на каждый чих".VM отражает Модель, а не View. Модель делает ПОПЫТКУ изменения в ХРАНИЛИЩЕ. Если попытка удачна, то нужно уведомить своих потребителей об изменении. Если уведомлять о замене сущности, то мы получаем новую сущность и целиком её отправляем потребителям. А если уведомлять только об изменении одного из свойств, то придётся отправлять событие НА КАЖДОЕ изменённое свойство. Это сложнее, объёмнее по коду как в Модели так и в её потребителях. Я даже не знаю в каких сценариях это может быть эффективно. Разве что огромные сущности, у которых одновременно может меняться одно-два свойства. "Огромные" - это те которые в памяти занимают, наверное, сотни килобайт.
0
|
||||
|
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
|
|
| 12.04.2023, 21:37 [ТС] | |
|
0
|
|
|
Модератор
|
||||
| 12.04.2023, 21:43 | ||||
|
Но это частный случай. В общем случае нужно создавать эффективную архитектуру Модели, а как ей удобно сохранять - это вторичный вопрос. У вас какая задача стоит? Добавлено через 4 минуты И посмотрите что вы получите. ПЕРЕД обновлением БД, вы сначала изменяете сущность. И все изменения отразятся в View. Если сохранения не произойдёт, View, то разорвётся связь. В Хранилище будут одни данные, в Модели другие. Если сохранять, и потом обновлять сущность, то придётся это делать отдельно для каждого свойства. И что этим выиграется? Только код станет объёмнее и запутанее. Добавлено через 48 секунд Если уже есть сохранённая сущность, зачем из неё данные переписывать в старую, если гораздо проще заменить их?
0
|
||||
|
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
|
||||
| 12.04.2023, 22:24 [ТС] | ||||
|
Добавлено через 9 минут
0
|
||||
|
Модератор
|
|||
| 12.04.2023, 23:06 | |||
|
Если уже есть сохранённая сущность, зачем из неё данные переписывать в старую, если гораздо проще заменить их?
Один из вариантов я вам показывал в теме Отправка объекта IList с выбранными элементами в ViewModel У меня даже тема есть соответствующая INPC (INotifyPropertyChanged) и получение данных из Модели [WPF, Элд Хасп] Но "поигравшись" с множеством различных реализаций, всё же приходишь к мнению, что INPC неудобен. По сути он имеет преимущества только, если работа данными идёт с использованием рефлексии или чего-то близкого (привязки, например). Или когда очень много свойств и за всеми нужно следить по отдельности. В Шарпе же принята всё таки строгая типизация и с ней лучше сочетаются индивидуальные события. Например, при изменении статуса у нас же меняется не только Статус, но и текущий пользователь. А ДЛЯ INPC нужно делать их раздельную прослушку.
1
|
|||
|
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
|
||||||||||||||||
| 14.04.2023, 14:15 [ТС] | ||||||||||||||||
|
Элд Хасп, то есть по вашему мнению существует только одна адекватная реализация редактирования - замена сущности целиком. Или есть ещё какие-то варианты?
И сейчас у меня ещё два вопроса возникло. В одном из вариантов того же демо экзамена есть условие: если у товара имеется скидка, то основная цена должна быть перечеркнута и рядом дописана цена с учетом скидки. Здесь, я так понимаю, для перечеркивания нужно воспользоваться свойством TextBlock.TextDecorations. И раз тут нужно два текста, где один перечеркнут, другой нормальный, то потребуется 2 объекта Run. Проблема: нужно переменное число объектов в зависимости от условия. Хотел создать конвертер, который будет формировать эти объекты, но вот незадача: свойство TextBlock.Inlines не имеет метода задания и к тому же оно не DP. Как тут быть? Второй вопрос. Вот, скажем, для тех же товаров задаю DataTemplate в ListBox. И весь этот шаблон создаю в элементе, производном от UserControl. Ну вот так мне захотелось писать, не прямо в DataTemplate, а в отдельном файле. И вопрос: почему я в моем шаблоне DataTemplate в DataTrigger не могу обратиться к именованному элементу, который находится в UserControl? Пример (содержимое UserControl):
По поводу второго вопроса я сейчас подумал: причина в области видимости? Область видимости именованного StackPanel в UserControl отлична от той, когда он создается в шаблоне. То есть в шаблоне рассматриваются только те элементы, которые были созданы и именованы непосредственно в нем
0
|
||||||||||||||||
|
Модератор
|
||||
| 14.04.2023, 20:40 | ||||
|
Но опять таки, не исключаю, что какой-то вариант мне просто не пришёл в голову. Но есть же ещё и другие задачи. Например, изменения могут накапливаться в Модели, и их сохранение происходит явным вызовом метода. В таком случае, данные Модели уже не отражают Хранилище и здесь замена сущностей это не единственный вариант. Например, игра. Есть предметы, поля, юниты и т.д. Всё это взаимодействует между собой. И если уменьшилось здоровье юнита, то можно только об этом и уведомить через INPC. Добавлено через 3 минуты Есть текущая цена, которая отображается всегда. В некоторых случаях есть предыдущая цена. Так как она есть не у всех товаров, то это должен быть Nullable<decimal>.Что касается вывода, то можно сделать два TextBlock. Тот который выводит Nullable коллапсирует, если null.Добавлено через 4 минуты Целевой элемент вычисляет ДО применения шаблона. И в это время он никак не может увидеть элементы вне себя.
0
|
||||
| 14.04.2023, 20:40 | |
|
Создание базы данных с функциями ввода, вывода, редактирования, удаления или добавления данных Формы редактирования, добавления данных Форма для добавления, редактирования, удаления данных Пример добавления, удаления и редактирования данных в БД *.mbd Использование возможностей добавления, редактирования и удаления необходимых записей в базы данных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|