Форум программистов, компьютерный форум, киберфорум
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. Показов 9366. Ответов 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
14.03.2023, 21:45  [ТС]
Студворк — интернет-сервис помощи студентам
Элд Хасп, добрый вечер, мне вот что интересно. Разве это того стоит - ради одного изменения каждого свойства снабжать класс наследованием от ViewModelBase? Ну я о классе AddOrUpdateProductDialogData. Вы в своих проектах тоже так делаете?

Добавлено через 1 минуту
Я в тот раз смог сделать без наследования. Правда там в конструкторе было куча ошибок
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
14.03.2023, 21:55
INexteR, нужно:
1) способ при котором компоновка с привязками задаётся в XAML, а источник с данными инициализируется в Code Behind после инициализации XAML:
2) Нужен лёгкий способ обращения к источнику данных на любом уровне компоновки. В том числе из ToolTip, ContextMenu и т.п.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
14.03.2023, 22:00  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
INexteR, нужно:
То есть в своих проектах Вы такой же прием используете?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
14.03.2023, 22:17
Цитата Сообщение от INexteR Посмотреть сообщение
Я в тот раз смог сделать без наследования. Правда там в конструкторе было куча ошибок
Да, способов много.
В каждом есть свои плюсы или минусы.
Для меня такое использование привычно.
Тем более, если вы помните начальную реализацию, делается один рас комплекс обобщенных классов для обобщенного диалога.
И потом просто задаются нужные обобщения.
Ведь таких диалогов в реальном приложении может быть очень много. Даже в вашем приложении если добавить функционал полного редактирования, то выйдет больше пяти разных диалогов.

Кроме того.
Базовые классы обобщенного диалога, содержатся в от дельной библиотеке, которая используется во множестве проектов.

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

Добавлено через 2 минуты
Элд Хасп, я там фиксацию, если что, отправил, Вы можете посмотреть, что я там накуролесил с изображениями. Правда, вам это все вряд ли понравится
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
14.03.2023, 23:43
Цитата Сообщение от INexteR Посмотреть сообщение
Правда, вам это все вряд ли понравится

Сегодня вымотался "как собака" на работе. Нет сил этим заниматься.
Завтра постараюсь посмотреть.

Добавлено через 1 минуту
Цитата Сообщение от INexteR Посмотреть сообщение
И меня очень беспокоит вопрос о том, как не дублировать тучу xaml
C XAML всё несколько сложнее.
Чтобы использовать что-то типа наследования в Шарпе, придётся вместо контента задавать шаблоны.

Добавлено через 1 час 11 минут
Цитата Сообщение от INexteR Посмотреть сообщение
я там фиксацию, если что, отправил,
Последняя выдаёт исключение после клика по гость.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
15.03.2023, 06:33  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Последняя выдаёт исключение после клика по гость.
Аааа, дело в том, что у всех изображений я убрал опцию содержание. То есть я хотел, чтобы после первого запуска папка Images возле сборки не содержала тех изображений, которые я удалил при прошлом запуске. Вам для запуска без исключений нужно скопировать папку Images из NewTrade и поместить копию рядом со сборкой
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
15.03.2023, 11:14
Цитата Сообщение от INexteR Посмотреть сообщение
для запуска без исключений
Это надо решить как-то п од другому.
Не нормально что после новой сборки приложение падает с исключением.
Постараюсь посмотреть вечером что и как.

Нужно в конвертере обрабатывать ошибку отсутствия папки и файла и как-то прокидывать исключение в App.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
15.03.2023, 14:15  [ТС]
Элд Хасп, ну то есть здесь суть такая: нужно только первый раз скопировать папку Images с изображениями как содержимое, дальше это уже не нужно, так как в папку будут снова и снова попадать изображения, которые уже потенциально могли быть удалены в какой-то из запусков. В таком случае с текущей логикой программы не получится добавить товару какое-то из этих изображений, так как оно автоматически скопировалось в папку
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
15.03.2023, 15:13
Цитата Сообщение от INexteR Посмотреть сообщение
ну то есть здесь суть такая: нужно только первый раз скопировать папку Images с изображениями как содержимое,
Совсем не понял.
Если это нужно при первом запуске приложения, то почему не поставить в настройках папки, чтобы она автоматически копировалась в сборку?

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

Добавлено через 47 секунд
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я постараюсь посмотреть вечером и разобраться.
Да нет, в этом не нужно разбираться, с этим все понятно. Это я вам просто ситуацию объяснил

Добавлено через 5 минут
Мне нужно задать кисть для ComboBox. В win 10 в стандартом шаблоне нет привязки к кисти элемента. Может Вы знаете какой-то хак, чтобы не переписывать шаблон целиком?

Добавлено через 5 минут
И ещё я бы хотел при добавлении элемента выполнить к нему прокрутку, воспользовавшись методом BringIntoView. Для этого нужна ссылка на него. Недоумеваю, где её взять
0
 Аватар для Andrey-MSK
3390 / 2276 / 388
Регистрация: 14.08.2018
Сообщений: 7,696
Записей в блоге: 4
15.03.2023, 16:35
Цитата Сообщение от INexteR Посмотреть сообщение
Для этого нужна ссылка на него. Недоумеваю, где её взять
C#
1
SelectedItem = MyCollection.FirstOrDefault(m => m.ID == myID);
И Behavior для перемотки, тут для DataGrid
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Windows.Controls;
 
using Microsoft.Xaml.Behaviors;
 
namespace DBClient
{
    public class ScrollIntoViewBehavior : Behavior<DataGrid>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            AssociatedObject.SelectionChanged +=
                new SelectionChangedEventHandler(AssociatedObjectSelectionChanged);
        }
        protected override void OnDetaching()
        {
            AssociatedObject.SelectionChanged -=
                new SelectionChangedEventHandler(AssociatedObjectSelectionChanged);
            base.OnDetaching();
        }
 
        private async void AssociatedObjectSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (sender is DataGrid)
            {
                DataGrid grid = sender as DataGrid;
                object item = grid?.SelectedItem;
 
                if (item != null)
                {
                    Action action = () =>
                    {
                        if (grid != null && item != null)
                        {
                            grid.UpdateLayout();
                            grid.ScrollIntoView(item, null);
                        }
                    };
 
                    if (grid.Dispatcher.CheckAccess())
                    {
                        action();
                    }
                    else
                    {
                        await grid.Dispatcher.BeginInvoke(action);
                    }
                }
            }
        }
    }
}
2
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
15.03.2023, 16:48  [ТС]
Andrey-MSK, я вот так сделал
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private readonly ItemContainerGenerator generator;
public ProductsView()
{
    InitializeComponent();
    generator = list.ItemContainerGenerator;
    generator.ItemsChanged += Generator_ItemsChanged;
}
 
private void Generator_ItemsChanged(object sender, ItemsChangedEventArgs e)
{
    if (e.Action is NotifyCollectionChangedAction.Add)
    {
        var container = (ListBoxItem)generator.ContainerFromIndex(e.Position.Index);
        container.BringIntoView();
    }
}
0
 Аватар для Andrey-MSK
3390 / 2276 / 388
Регистрация: 14.08.2018
Сообщений: 7,696
Записей в блоге: 4
15.03.2023, 16:59
INexteR, Ну у меня SelectedItem через VM задаётся, а Behavior прикручен к DataGrid и DataGrid уже прокручивает сам себя до выделенного элемента.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
15.03.2023, 17:38  [ТС]
Andrey-MSK, я вижу, что Вы разбираетесь в потоках. И раз уж Вы здесь, то объясните мне один момент, связанный с нововведением в C# 8 - IAsyncEnumerable. Почему при таком коде UI поток не блокируется
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private async void Button_Click(object sender, RoutedEventArgs e)
{
    await foreach (var symb in GetCharsAsync())
    {
        list.Items.Add(symb);
    }
}
 
private async IAsyncEnumerable<char> GetCharsAsync()
{
    foreach (char symb in "123456789")
    {
        yield return symb;
        await Task.Delay(1000);
    }
}
А при таком - блокируется
C#
1
2
3
4
5
6
7
8
9
private async void Button_Click(object sender, RoutedEventArgs e)
{
    using var ctx = await Task.Run(() => new Context());
 
    await foreach (var user in ctx.Users)
    {
        list.Items.Add(user.Name);
    }
}
0
 Аватар для Andrey-MSK
3390 / 2276 / 388
Регистрация: 14.08.2018
Сообщений: 7,696
Записей в блоге: 4
15.03.2023, 17:42
Цитата Сообщение от INexteR Посмотреть сообщение
что Вы разбираетесь в потоках
Ну как сказать разбираюсь, не так чтобы очень
Цитата Сообщение от INexteR Посмотреть сообщение
связанный с нововведением в C# 8
Я пишу на NET Framework 4.8, а там C# 7...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
15.03.2023, 20:26
Цитата Сообщение от INexteR Посмотреть сообщение
После первого уже нужно снять этот параметр, так как в папку могут скопироваться изображения, которые пользователь уже удалил
Чаво???!!!
Пользователь НЕ ДОЛЖЕН работать в папках РЕШЕНИЯ!!!
Сделали сборку. Скопировали её в рабочую папку. И пользователь в ней работает запуская экзешник сборки, а не Студию.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
15.03.2023, 20:32  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сделали сборку. Скопировали её в рабочую папку. И пользователь в ней работает запуская экзешник сборки, а не Студию.
Все, понял. Извиняюсь

Добавлено через 3 минуты
Цитата Сообщение от INexteR Посмотреть сообщение
Мне нужно задать кисть для ComboBox. В win 10 в стандартом шаблоне нет привязки к кисти элемента. Может Вы знаете какой-то хак, чтобы не переписывать шаблон целиком?
Не знаете это?

Добавлено через 1 минуту
Я сейчас отправил фиксацию и снова забыл изображениям в папке Images назначить параметром содержимое, блин
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
15.03.2023, 20:39
Цитата Сообщение от INexteR Посмотреть сообщение
Да нет, в этом не нужно разбираться, с этим все понятно.
Точно НЕ ПОНЯТНО. Только не мне, а вам.

Цитата Сообщение от INexteR Посмотреть сообщение
А при таком - блокируется
Читайте документацию:
await foreach
Ограничения асинхронного режима - Microsoft.Data.Sqlite

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

await же сам по себе создать из синхронного кода, асинхронный код не может.
async-await управляют асинхронностью, а не создаю её.

Добавлено через 1 минуту
Цитата Сообщение от INexteR Посмотреть сообщение
Все, понял.
Пока писал - вы уже поняли.


Цитата Сообщение от INexteR Посмотреть сообщение
Цитата Сообщение от INexteR Посмотреть сообщение
Мне нужно задать кисть для ComboBox. В win 10 в стандартом шаблоне нет привязки к кисти элемента.
Не знаете это?
Наверное знаю, если пойму о чём вы.

Добавлено через 36 секунд
В ComboBox масса свойств-кистей, а вы говорите что их нет.
Кисть для чего вы имеете виду?
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
15.03.2023, 20:43  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Точно НЕ ПОНЯТНО
Честно говорю, уже стало понятно

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В ComboBox масса свойств-кистей, а вы говорите что их нет.
Свойства кистей есть, но они не окрашивают его область, так как шаблон ControlTemplate их не использует

Добавлено через 58 секунд
Имею в виду Background. Мне нужно окрасить фон. BorderBrush, возможно, шаблон подхватывает, но не он нужен
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.03.2023, 20:43

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
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