Форум программистов, компьютерный форум, киберфорум
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. Показов 9370. Ответов 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
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
11.03.2023, 20:44  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Мастак вы загадки подкидывать....
Извиняюсь
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ещё мне не нравится, то что после "Сохранить" Окно не закрывается.
Это надо исправить
Цитата Сообщение от Элд Хасп Посмотреть сообщение
раз у нас все сущности всё равно загружаются, потом опять подключаются, то может и хранить их в контексте БД?
Открыть его один раз и не закрывать.
Это при переходе от каталога к авторизации?

Добавлено через 1 минуту
Вы не подскажете как в TextCompositionEventHandler обработчике получить полный текст элемента, а не введенную часть?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.03.2023, 21:09
Цитата Сообщение от INexteR Посмотреть сообщение
Я сейчас ради интереса попытался в ToolTip элемента отобразить все его валидационные ошибки.
ToolTip какого элемента?
А так Popup, ToolTip, ContextMenu - визуализируются одинаково.
Только имеют чуть различное поведение.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
11.03.2023, 21:23  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
ToolTip какого элемента?
Например у сетки, которая в диалоге
XML
1
<Grid Row="1" DataContext="{Binding Product, Source={StaticResource dialogData}, ValidatesOnNotifyDataErrors=False}">
Только ValidatesOnNotifyDataErrors=False в конце надо убрать (в самом проекте это не нужно, просто интересно, как этого добиться с помощью xaml, у меня не получалось. Если у вас получится, покажите код здесь)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.03.2023, 21:58
Цитата Сообщение от INexteR Посмотреть сообщение
Например у сетки, которая в диалоге
Сделал у кнопки
XML
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
            <Grid>
                <Button Content="Сохранить"
                    x:Name="button"
                    CommandParameter="{Binding Product, NotifyOnValidationError=False, Source={StaticResource dialogData}}"
                    Margin="0 0 20 0"
                    IsEnabled="{Binding Product.HasErrors, Source={StaticResource dialogData}, Converter={cnvs:BooleanNot}}">
                </Button>
                <Grid Background="Transparent"
                      DataContext="{Binding Product, NotifyOnValidationError=False, Source={StaticResource dialogData}}"
                      Validation.ErrorTemplate="{x:Null}">
                    <FrameworkElement.Style>
                        <Style TargetType="FrameworkElement">
                            <Style.Triggers>
                                <Trigger Property="Validation.HasError" Value="False">
                                    <Setter Property="Visibility" Value="Hidden"/>
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </FrameworkElement.Style>
                    <FrameworkElement.ToolTip>
                        <ToolTip x:Name="tip">
                            <StackPanel>
                                <TextBlock Text="Все ошибки."/>
                                <ItemsControl ItemsSource="{Binding PlacementTarget.(Validation.Errors), RelativeSource={RelativeSource FindAncestor, AncestorType=ToolTip}}"
                                              DisplayMemberPath="ErrorContent"/>
                            </StackPanel>
                        </ToolTip>
                    </FrameworkElement.ToolTip>
                </Grid>
            </Grid>
Добавлено через 1 минуту
У грида будет проще, поскольку не надо его перекрывать другим элементом.
Для кнопки пришлось так делать, так как у отключенного элемента не выводится ToolTip.

Добавлено через 5 минут
Цитата Сообщение от INexteR Посмотреть сообщение
Вы не подскажете как в TextCompositionEventHandler обработчике получить полный текст элемента, а не введенную часть?
Это для чего?
Где вы его используете?

Добавлено через 1 минуту
Цитата Сообщение от INexteR Посмотреть сообщение
Это при переходе от каталога к авторизации?
Нет, сразу при создании магазина. Авторизация же тоже через него производится.

Добавлено через 3 минуты
Цитата Сообщение от INexteR Посмотреть сообщение
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ещё мне не нравится, то что после "Сохранить" Окно не закрывается.
Это надо исправить
Тут проблема в обработке команды.
Если закрывать Окно после клика - то это просто реализовать. Надо только кликер добавить.
А вот если реализовывать закрытие в зависимости от успешности сохранения, то нужно как-то из VM получить результат выполнения.
А это без танцев с бубном не получится.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
11.03.2023, 22:17  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это для чего?
Где вы его используете?
Ввод стоимости. Пока нигде
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Нет, сразу при создании магазина. Авторизация же тоже через него производится.
Понял. То есть так же как и в теме с быстрой реализацией?

Добавлено через 12 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А вот если реализовывать закрытие в зависимости от успешности сохранения, то нужно как-то из VM получить результат выполнения.
У нас результата нет, значит не нужно заморачиваться.
Цитата Сообщение от INexteR Посмотреть сообщение
Что-то мне подсказывает, что для обсуждения диалога нужна другая тема
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.03.2023, 22:48
Цитата Сообщение от INexteR Посмотреть сообщение
А какие пути использовать тогда?
Фактически путь в БД - это просто ключ картинки по которому нужное её создать.
Так как картинки у вас все в одной папке, то даже имя папки нет необходимости хранить.
А вот задача преобразовать этот ключ в картинку - это уже задача View.
Я создавал конвертер для этого. Но вы его удаляете почему-то.


Цитата Сообщение от INexteR Посмотреть сообщение
Ну простите, я вообще в этом не разбираюсь. Поставил ресурс, так как в таком случае изображения отображаются в ListBox. А что значит ресурс и содержание?
Ресурс - это то что при компиляции включается в скомпилированный файл exe или dll.
Содержание - это внешний файл который хранится рядом со сборкой.
У вас по заданию пользователь должен выбирать файла и они переносятся в папку приложения.
Поэтому это внешние файлы, а не часть скомпилированного.

Цитата Сообщение от INexteR Посмотреть сообщение
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Можно перекинуть реализацию на уровень VM - как LoginPassword.
Можно явно в VM передавать информацию об ошибке из View.
Можете хотя бы на словах разъяснить? Интересно стало, какие ещё есть варианты
первый вариант у нас уже реализован для LoginPassword.
Точно так же сделать и для товара.

Второй вариант потребует сложного аргумента для команды.
В одном свойстве будет передаваться товар, в другом (или других) дополнительная информация от View.

Добавлено через 5 минут
Цитата Сообщение от INexteR Посмотреть сообщение
Ввод стоимости. Пока нигде
Я просто как-то пока не сталкивался с ним.
И даже не пойму где он вызываться будет.
Задайте обработчик, посмотрите что приходит в свойствах аргумента.

Цитата Сообщение от INexteR Посмотреть сообщение
То есть так же как и в теме с быстрой реализацией?
Да.
Только не на уровне View, а на уровне Модели (Магазина).

Цитата Сообщение от INexteR Посмотреть сообщение
У нас результата нет, значит не нужно заморачиваться.
Тогда просто кликер задайте такой же как для кнопки отмена.

Цитата Сообщение от INexteR Посмотреть сообщение
Что-то мне подсказывает, что для обсуждения диалога нужна другая тема
Для этого нужно время, а его нет.
Это минимум час уйдёт на перетаскивание.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
11.03.2023, 22:48  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сделал у кнопки
Я в вашем коде вообще запутался. Как я вижу, Вы сделали это у сетки, а не у кнопки, она просто сверху находится. Тут, похоже, какой-то трюк с PlacementTarget используется
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.03.2023, 22:52
Цитата Сообщение от INexteR Посмотреть сообщение
Я в вашем коде вообще запутался. Как я вижу, Вы сделали это у сетки, а не у кнопки, она просто сверху находится.
Из-за того что у отключенной кнопки не вызывается ToolTip, пришлось на ней вывести Grid.
Который исчезает как только кнопка активируется.
Вот в этом гриде и реализован показ ошибок валидации.
Перетащите этот код туда куда вам нужно.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
11.03.2023, 22:54  [ТС]
Я писал подобный код без стиля. И ничего друг на друга не наслаивал. И в тех случаях PlacementTarget всегда был пуст
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.03.2023, 22:56
Цитата Сообщение от INexteR Посмотреть сообщение
Я писал подобный код без стиля.
Стиль нужен только для того чтобы при активации кнопки грид не перекрывал её.
Если удалить стиль - всё продолжит работать. Только кнопка не будет кликаться.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
11.03.2023, 22:56  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я создавал конвертер для этого. Но вы его удаляете почему-то.
Ай, простите, я думал, что Вы его добавляли из-за режима дизайнера
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.03.2023, 22:59
Цитата Сообщение от INexteR Посмотреть сообщение
И в тех случаях PlacementTarget всегда был пуст
Только если вы его не у того элемента проверяли.
Он пустым не может быть.

Добавлено через 2 минуты
Цитата Сообщение от INexteR Посмотреть сообщение
Ай, простите, я думал, что Вы его добавляли из-за режима дизайнера
Вот, кстати, это пример того, что при запуске приложения в разном окружении относительные пути могут не работать.
Другой пример, если вы запустите приложение не из его папки, а из другой папки, например по ссылке, то тоже относительные пути выдадут ошибку.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
11.03.2023, 23:10  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я просто как-то пока не сталкивался с ним.
И даже не пойму где он вызываться будет.
Ну это событие PreviewTextInput. Хочу его обработать в зависимости от того, введено ли вещественное число правильного формата. И я уже сделал это, вроде бы нормально работает. Выяснил, что полный текст элемента нельзя получить без обращения к нему. То есть приходится считывать из DP
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.03.2023, 23:30
Цитата Сообщение от INexteR Посмотреть сообщение
Хочу его обработать в зависимости от того, введено ли вещественное число правильного формата.
Лучше привязанную строку обрабатывать.
В PreviewTextInput - можно извлечь вводимый текст и текст который ещё не изменён из контрола.
В общем геморройное это дело.
Лучше придумать какой-то другой способ.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
12.03.2023, 12:11  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В PreviewTextInput - можно извлечь вводимый текст и текст который ещё не изменён из контрола.
В общем геморройное это дело.
Я его довольно просто решил. PreviewTextInput + конвертер. Можете посмотреть, я отправил фикс.
И тут две такие проблемы нарисовались:
1) при копировании копируется и Id. А он должен быть 0. Иначе выбрасывается исключение при попытке добавления. Допустимо ли прямо в модели товару в Id записать 0?
2) если попробовать редактировать товар 2 раза подряд, то опять же вылетает исключение. В нем говорится, что якобы в контексте уже есть этот товар или что-то наподобие этого. Можете проверить

Добавлено через 4 минуты
Ещё верните пожалуйста свой конвертер для изображений. С их путями тоже нужно решить вопрос. Из прошлого вашего сообщения я так понял, что из бд нужно удалить путь к каталогу изображений /Images/, верно? Хранить только само название
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
12.03.2023, 12:25
Цитата Сообщение от INexteR Посмотреть сообщение
1) при копировании копируется и Id. А он должен быть 0. Иначе выбрасывается исключение при попытке добавления. Допустимо ли прямо в модели товару в Id записать 0?
Странно...
Проверю.
По идее при Add в контексте БД не должен учитываться Id.
Если учитывается, то его надо сбрасывать, конечно.

Цитата Сообщение от INexteR Посмотреть сообщение
2) если попробовать редактировать товар 2 раза подряд, то опять же вылетает исключение.
Я там делал отключение сущности.
Вроде не должно такого происходить.
Проверю.

Добавлено через 4 минуты
Цитата Сообщение от INexteR Посмотреть сообщение
1) при копировании копируется и Id. А он должен быть 0. Иначе выбрасывается исключение
У меня всё работает без исключений.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
12.03.2023, 12:55  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У меня всё работает без исключений.
Потому что я там в методе Add прописал product.Id = 0;
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
12.03.2023, 13:22
Цитата Сообщение от INexteR Посмотреть сообщение
Потому что я там в методе Add прописал product.Id = 0;
Это похоже диалект SQLite.
Вроде на других БД такого не требуется.

Перевёл реализацию на один экземпляр контекста БД на время сеанса приложения.
Вроде, всё работает.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
12.03.2023, 13:42  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вроде на других БД такого не требуется.
На ms sql server тоже добавление не проходило с установленным Id

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Перевёл реализацию на один экземпляр контекста БД на время сеанса приложения.
Меня всегда интересовало, чем плохо то, что используется один контекст с долгим жизненным циклом?

Добавлено через 2 минуты
Оцените то как работает ввод цены. Попробуйте ввести число некорректного формата
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
12.03.2023, 14:26
Цитата Сообщение от INexteR Посмотреть сообщение
конвертер для изображений
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
using System;
using System.Globalization;
using System.IO;
using System.Windows.Data;
using System.Windows.Markup;
 
namespace NewTrade.Views
{
    public class ImageNameToPathConverter : IValueConverter
    {
        private const string ImageFolder = "Images";
        private static readonly string ImageFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ImageFolder);
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string name = (string)value;
            if (string.IsNullOrWhiteSpace(name))
                return name;
            return Path.Combine(ImageFolderPath, name);
        }
 
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
        private ImageNameToPathConverter() { }
        public static ImageNameToPathConverter Insatance { get; } = new();
    }
 
    [MarkupExtensionReturnType(typeof(ImageNameToPathConverter))]
    public class ImageNameToPathExtension : MarkupExtension
    {
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return ImageNameToPathConverter .Insatance;
        }
    }
}
Скинул фиксацию.

Добавлено через 1 минуту
Цитата Сообщение от INexteR Посмотреть сообщение
чем плохо то, что используется один контекст с долгим жизненным циклом?
Он забирает память.
Представьте что у вас миллионы записей в десятках связанных таблиц...

Добавлено через 26 минут
INexteR, и БД теперь нужно записывать ТОЛЬКО имя файла.
Без папки.
Папку будет добавлять конвертер.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.03.2023, 14:26

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
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 Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru