Форум программистов, компьютерный форум, киберфорум
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. Показов 9592. Ответов 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
12.03.2023, 14:36  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
INexteR, и БД теперь нужно записывать ТОЛЬКО имя файла.
Да, увидел

Добавлено через 3 минуты
Я, кстати, вначале подумал, что мы будем при редактировании менять лишь свойства, а не сам объект

Добавлено через 2 минуты
Теперь надо как-то выбирать изображение в диалоге...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.03.2023, 15:00
Цитата Сообщение от INexteR Посмотреть сообщение
Оцените то как работает ввод цены. Попробуйте ввести число некорректного формата
А TextChanged не проще использовать?

Добавлено через 1 минуту
Цитата Сообщение от INexteR Посмотреть сообщение
Теперь надо как-то выбирать изображение в диалоге...
Получаете полное имя файла.
Копируете его в папку приложения с преобразованием в нужное качество.
Запоминаете только имя файла.
Всё.
Какие трудности?

Добавлено через 4 минуты
Цитата Сообщение от INexteR Посмотреть сообщение
Я, кстати, вначале подумал, что мы будем при редактировании менять лишь свойства, а не сам объект
У нас же имутабельный Iproduct.
Мы не можем в нём менять свойства.

Добавлено через 1 минуту
Для мутабельности свойств пришлось бы прописывать реализацию INPC.
А для Модели это не к месту.
Так можно сделать в "быстром" варианте.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
12.03.2023, 17:20  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А TextChanged не проще использовать?
Ну так оно же возникает после ввода текста, а надо запретить ввод в некоторых случаях

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Получаете полное имя файла.
Копируете его в папку приложения с преобразованием в нужное качество.
Запоминаете только имя файла.
Это всё возложено на view?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.03.2023, 18:46
Цитата Сообщение от INexteR Посмотреть сообщение
Это всё возложено на view?
Вызов диалога открытия файлов - View.
Остальные действия - оно как бы не View, но и не для основной VM.
Для основной VM нужен только стринговый ключ (имя файла), который сохраняется в БД.

Все эти действия - это либо своя независимая VM+Модель, либо уровень App.
Так как у наc уровни App и View не разделены (они вообще в простых WPF приложениях разделяются исключительно редко), то можно создать какой-то хелпер или добавить функционал в ViewHelper.
1
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
12.03.2023, 19:03  [ТС]
Элд Хасп, понял, а не подскажете, какие свойства следует задать для диалога выбора файла?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.03.2023, 19:12
Цитата Сообщение от INexteR Посмотреть сообщение
какие свойства следует задать для диалога выбора файла?
OpenFileDialog Класс (Microsoft.Win32)
C#
1
2
3
4
Multiselect=false;
 
Filter = "Изображения|*.png;*.jpg;*.tif" + // Здесь надо перечислить все расширения для файлов
             "|Все файлы|*.*";
Остальные на усмотрение.
1
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
12.03.2023, 20:44  [ТС]
Элд Хасп, благодарю

Добавлено через 1 минуту
Но Вы ничего не сказали насчет ввода цены. Неплохо ведь получилось? В конвертере возвращается Binding.DoNoting, чтобы при дописывании десятичной точки в TempProduct не менялось значение свойства.
Ну, это в случае, если точка была дописана в самый конец
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.03.2023, 21:48
Цитата Сообщение от INexteR Посмотреть сообщение
Но Вы ничего не сказали насчет ввода цены. Неплохо ведь получилось?
Да. нормально получилось.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
12.03.2023, 22:31  [ТС]
Элд Хасп, помнится мне, что в конвертере для изображений Вы использовали синтаксис упакованных uri. А почему в этом конвертере не так? Или тот был адаптирован специально для режима дизайнера?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.03.2023, 00:07
Цитата Сообщение от INexteR Посмотреть сообщение
Или тот был адаптирован специально для режима дизайнера?
Я его делал из расчёта, что все рисунки находятся внутри сборки.
А потом выяснилось, что это внешние файлы рядом со сборкой.
Изменилась задача - изменилась и реализация.

Добавлено через 2 минуты
INexteR, смотрю на ваш конвертер и обработчик.
И думаю как бы их совместить.
Пока в голову ничего не пришло.

Добавлено через 19 минут
Проблема упирается в то, что в Binding закрыт метод ProvideValue.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
13.03.2023, 10:47  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
смотрю на ваш конвертер и обработчик.
И думаю как бы их совместить.
Пока в голову ничего не пришло.
Доброе утро. А что, вроде же в этой парочке не так много кода. То, что они разделены, не является проблемой

Добавлено через 37 минут
С выбором файла я сделал пока так:
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
public static RelayCommand<TextBox> ChooseImage { get; } = new(ChooseImageExecute);
 
private static void ChooseImageExecute(TextBox textBox)
{
    var dialog = new OpenFileDialog
    {
        Title = "Выбор изображения",
        Multiselect = false,
        Filter = "Изображения|*.png;*.jpg;*.tif|Все файлы|*.*"
    };
    var result = dialog.ShowDialog() ?? false;
    if (result)
    {
        var fileName = Path.GetFileName(dialog.FileName);
        var newImage = File.Create(Path.Combine(ImageNameToPathConverter.ImageFolderPath, fileName));
        var file = dialog.OpenFile();
        file.CopyTo(newImage);
        file.Close();
        newImage.Close();
        textBox.SetCurrentValue(TextBox.TextProperty, fileName);
    }
}
 
public static RelayCommand<TextBox> RemoveImage { get; } = new(RemoveImageExecute, 
    tb => !string.IsNullOrWhiteSpace(tb.Text));
 
private static void RemoveImageExecute(TextBox textBox)
{
    var path = Path.Combine(ImageNameToPathConverter.ImageFolderPath, textBox.Text);
    File.Delete(path);
    textBox.Clear();
}
(Команда удаления служит для очистки поля пути изображения и удаления изображения, для этой команды добавил кнопку). Насчет передачи параметром текстового поля я знаю, позже исправлю на TempProduct. Возникает ошибка при попытке удаления: System.IO.IOException: "The process cannot access the file 'C:\Users\rusla\Desktop\repos\NewTradeSl n\NewTrade\bin\Debug\net7.0-windows\Images\wf.jpg' because it is being used by another process."

Добавлено через 14 минут
Я заметил, что в папку net7.0-windows копируется папка с изображениями. Разве должно быть так? И выходит, что я работаю с этой папкой, а не с той, что находится в папке NewTrade
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
13.03.2023, 19:43  [ТС]
Пришлось поменять код конвертера на такой
C#
1
2
3
4
5
6
7
8
9
10
11
string name = (string)value;
if (string.IsNullOrWhiteSpace(name))
    return null;
//return Path.Combine(ImageFolderPath, name);
using var fs = File.Open(Path.Combine(ImageFolderPath, name), FileMode.Open);
var image = new BitmapImage();
image.BeginInit();
image.StreamSource = fs;
image.CacheOption = BitmapCacheOption.OnLoad;
image.EndInit();
return image;
Оказалось, что по умолчанию система где-то удерживает файл открытым, что в дальнейшем выступает помехой для его удаления.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.03.2023, 20:25
Цитата Сообщение от INexteR Посмотреть сообщение
То, что они разделены, не является проблемой
Не проблема, но "глаза колет".
Они выполняют совместную функцию.
Если установить один без другого, то будет чёрт пойми что.
По ООП и SOLID лучше это как-то усовершенствовать.
Будет время - займусь.

Цитата Сообщение от INexteR Посмотреть сообщение
я сделал пока так:
Типично:
C#
11
12
13
    // var result = dialog.ShowDialog() ?? false;
    // if (result)
    if(dialog.ShowDialog() == true)
Цитата Сообщение от INexteR Посмотреть сообщение
ImageNameToPathConverter.ImageFolderPath
Я сделал по быстрому.
Возможно стоит перенести эти свойства и константы в App или в отдельный класс статических настроек.

Цитата Сообщение от INexteR Посмотреть сообщение
System.IO.IOException: "The process cannot access the file 'C:\Users\rusla\Desktop\repos\NewTradeSl n\NewTrade \bin\Debug\net7.0-windows\Images\wf.jpg' because it is being used by another process."
Конвертер используемый Image для создания изображений из других типов (в данном случае из строкового имени файла) не отпускает сам источник.
Решений два:
1) Копировать файл в память, и чтобы наш конвертер возвращал не путь к файлу, а массив из памяти. Тогда файл не будет захвачен.
2) Перед удалением задать в Image другой источник или обнулить. Тогда предыдущий источник будет отпущен. Это рациональнее по памяти. Но создаёт риски, что ссылка на файл будет в нескольких Image и просто потеряется контроль какой из них удерживает. Второй момент отпускание - это не мгновенный процесс. Возможно потребуется вызов мусорщика.

Добавлено через 3 минуты
Цитата Сообщение от INexteR Посмотреть сообщение
Я заметил, что в папку net7.0-windows копируется папка с изображениями. Разве должно быть так?
Да. Это и есть ваша сборка получаемая после компиляции.

Цитата Сообщение от INexteR Посмотреть сообщение
И выходит, что я работаю с этой папкой, а не с той, что находится в папке NewTrade
Всё верно.
NewTrade - это проект: исходные коды, различные ресурсы, настройки компиляции и т.д. Поэтому проекту компилятор создаёт сборку. А так как файлы ресурсов проекта тоже нужны для работы сборки, то они или компилируются внутрь ней, или копируются рядом с ней. По заданию вам нужно второе.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
13.03.2023, 20:25  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
а массив из памяти
byte[] ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.03.2023, 20:31
Цитата Сообщение от INexteR Посмотреть сообщение
Пришлось поменять код конвертера на такой
Фиксацию не сделали. Не могу посмотреть.
Можно проще - достаточно вернуть массив байт return File.ReadAllBytes(some_path_name);

Добавлено через 38 секунд
Цитата Сообщение от INexteR Посмотреть сообщение
byte[] ?
Да.
WPF умеет "переваривать" байтовый массив в изображение.

Добавлено через 40 секунд
Но конвертер. Мульти конвертер, по-моему, не умеет.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
13.03.2023, 20:33  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Фиксацию не сделали. Не могу посмотреть.
Я сейчас размышляю над тем, как мне при открытии диалога, выборе картинки и дальнейшем его закрытии (не кнопка сохранить) удалить выбранную картинку. То есть чтобы изображение впустую не лежало в папке
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.03.2023, 20:39
Цитата Сообщение от INexteR Посмотреть сообщение
То есть чтобы изображение впустую не лежало в папке
Можно добавить команду в настройках которая запросит все имена из БД и проверит папку.
Так, мне кажется лучше делать., чем авто удаление.
Вдруг удалил у одного и хочет добавить это изображение другому товару?

Добавлено через 1 минуту
Можно фоном вызывать проверку раз в час (или другой период).
Будет проверять наличие лишних файлов и отсутствие нужны.
Если есть ошибки, то выдавать предупреждение об этом.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
14.03.2023, 00:35  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вдруг удалил у одного и хочет добавить это изображение другому товару?
Я сделал так, что у каждого товара должно быть свое собственное изображение

Добавлено через 2 минуты
Да я уж и сам отредактировал сообщение. Это вышло из-за того что сайту стало плохо

Добавлено через 28 минут
Элд Хасп, я вот думаю при закрытии окна посредством не кнопки удаления, если Path у TempProduct != null, вызвать команду удаления

Добавлено через 1 минуту
Похоже, мне тут нужен EventToCommand

Добавлено через 6 минут
А, ну в таком случае при открытии диалога в режиме редактирования и наличия у него изображения, оно удалится

Добавлено через 3 часа 8 минут
Цитата Сообщение от INexteR Посмотреть сообщение
посредством не кнопки удаления
то есть кнопки сохранения

Добавлено через 4 минуты
Элд Хасп, да уж, там с этими изображениями настоящая проблема. Мне пришлось поместить код в cb
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
14.03.2023, 01:25
Цитата Сообщение от INexteR Посмотреть сообщение
Мне пришлось поместить код в cb
Скиньте завтра фиксацию.
Посмотрю вечером.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
14.03.2023, 10:04  [ТС]
Элд Хасп, я там прописал код с охапкой if, предотвращающий все это баловство с изображениями. Трудно его назвать читаемым/доступным, но он работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.03.2023, 10:04

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru