Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/27: Рейтинг темы: голосов - 27, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156

Как обнулить значения TextBox в команде после сохранения их в БД

21.03.2023, 15:34. Показов 7397. Ответов 134

Студворк — интернет-сервис помощи студентам
В TextBox я записываю данные которые потом сохраняются в бд, а как обновлять потом ТекстБоксы после добавления в команде, чтобы они обнулялись для добавления новых данных, чтобы пользователю не приходилось их стирать?

RelayCommand

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
using System;
using System.Windows.Input;
 
namespace WarhammerAGM
{
    /*Этот класс реализует интерфейс ICommand, благодаря чему с помощью подобных команды мы сможем направлять вызовы к ViewModel. 
     * Ключевым здесь является метод Execute(), который получает параметр и выполняет действие, переданное через конструктор команды.*/
    public class RelayCommand : ICommand
    {
        Action<object?> execute;
        Func<object?, bool>? canExecute;
 
        public event EventHandler? CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
 
        public RelayCommand(Action<object?> execute, Func<object?, bool>? canExecute = null)
        {
            this.execute = execute;
            this.canExecute = canExecute;
        }
 
        public bool CanExecute(object? parameter)
        {
            return canExecute == null || canExecute(parameter);
        }
 
        public void Execute(object? parameter)
        {
            execute(parameter);
        }
    }
}
ApplicationViewModel

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
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Query.Internal;
using System.Collections.ObjectModel;
using System.Windows.Controls;
using WarhammerAGM.Models;
using Xceed.Wpf.Toolkit;
 
namespace WarhammerAGM
{
    public class ApplicationViewModel
    {
        ApplicationContext db = new ApplicationContext();
        RelayCommand? addCommand;
        RelayCommand? editCommand;
        RelayCommand? deleteCommand;
        public BestiaryCreature BestiaryCreature { get; private set; } = new();
        public ObservableCollection<BestiaryCreature> BestiaryCreatures { get; set; }
        public ApplicationViewModel()
        {
            /*В конструкторе класса загружаем данные из бд в локальный кэш*/
            db.Database.EnsureCreated();
            db.BestiaryCreatures.Load();
            BestiaryCreatures = db.BestiaryCreatures.Local.ToObservableCollection();
        }
 
        // команда добавления
        public RelayCommand AddCommand
        {
            get
            {
                return addCommand ??
                  (addCommand = new RelayCommand((o) =>
                  {
                      BestiaryCreature bestiaryCreature = BestiaryCreature;
                      db.BestiaryCreatures.Add(bestiaryCreature);
                      db.SaveChanges();    
                      MessageBox.Show("Добавление прошло успешно");
                      
                  }));
            }
        }
    }
}
MainWindow.xaml
XML
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
    xmlns:AttachedBehaviors="clr-namespace:WarhammerAGM.AttachedBehaviors" xmlns:local="clr-namespace:WarhammerAGM"
    x:Class="WarhammerAGM.MainWindow"
    mc:Ignorable="d"
        Title="MainWindow" Height="540" Width="960">
    <Window.DataContext>
        <local:ApplicationViewModel/>
    </Window.DataContext>
 
 
 
    <Grid>
        <TabControl FontSize="36">
            <TabItem Header="TabItem">
                <Grid Background="#FFE5E5E5"/>
            </TabItem>
            <TabItem Header="TabItem">
                <Grid Background="#FFE5E5E5">
                    <TabControl FontSize="22">
                        <TabItem Header="Бестиарий">
                            <Grid Background="#FFE5E5E5">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <ListView x:Name="ListViewBestiaryAddEditChange" Grid.Column="0" ItemsSource="{Binding BestiaryCreatures}">
                                    <ListView.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel>
                                                <TextBlock Text="{Binding Name}" FontSize="16" />
                                            </StackPanel>
                                        </DataTemplate>
                                    </ListView.ItemTemplate>
                                </ListView>
                                <GridSplitter Grid.Column="1" ShowsPreview="False" Width="3" HorizontalAlignment="Center" VerticalAlignment="Stretch" />
                                <Grid Grid.Column="2">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="Auto"/>
                                    </Grid.RowDefinitions>
                                    <ScrollViewer Grid.Row="0" Background="Gray">
                                        <Grid x:Name="GridStatsEnter" Background="Gray" DataContext="{Binding BestiaryCreature}">
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="Auto"/>
                                                <RowDefinition Height="Auto"/>
                                                <RowDefinition Height="Auto"/>
                                                <RowDefinition Height="Auto"/>
                                                <RowDefinition Height="Auto"/>
                                            </Grid.RowDefinitions>
                                            <Grid Grid.Row="0">
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="Auto"/>
                                                    <ColumnDefinition Width="*"/>
                                                </Grid.ColumnDefinitions>
                                                <TextBlock Grid.Column="0" Text="Название:" Margin="5"/>
                                                <TextBox Text="{Binding Name}" Grid.Column="1" Margin="5"/>
                                            </Grid>
 
 
                                            <Grid Grid.Row="1" Margin="3">
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="*"/>
                                                </Grid.ColumnDefinitions>
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                </Grid.RowDefinitions>
                                                <TextBlock Grid.Column="0" Grid.Row="1" Text="ББ"/>
                                                <TextBox x:Name="BBStats" Grid.Column="0" Grid.Row="2" Text="{Binding Melee}" MaxLength="3" AttachedBehaviors:TextBoxBehavior.IsInteger="True" />
                                                <TextBlock Grid.Column="1" Grid.Row="1" Text="Б"/>
                                                <TextBox x:Name="BStats" Grid.Column="1" Grid.Row="2" Text="{Binding Ballistics}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="2" Grid.Row="1" Text="Сил"/>
                                                <TextBox x:Name="PowStats" Grid.Column="2" Grid.Row="2" Text="{Binding Power}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="3" Grid.Row="1" Text="Вын"/>
                                                <TextBox x:Name="EndurStats" Grid.Column="3" Grid.Row="2" Text="{Binding Endurance}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="4" Grid.Row="1" Text="Лов"/>
                                                <TextBox x:Name="DexStats" Grid.Column="4" Grid.Row="2" Text="{Binding Dexterity}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="5" Grid.Row="1" Text="Инт"/>
                                                <TextBox x:Name="IntStats" Grid.Column="5" Grid.Row="2" Text="{Binding Intelligence}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="6" Grid.Row="1" Text="Вос"/>
                                                <TextBox x:Name="PerStats" Grid.Column="6" Grid.Row="2" Text="{Binding Perception}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="7" Grid.Row="1" Text="СВ"/>
                                                <TextBox x:Name="WillPowStats" Grid.Column="7" Grid.Row="2" Text="{Binding Willpower}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                                <TextBlock Grid.Column="8" Grid.Row="1" Text="Тов"/>
                                                <TextBox x:Name="PartStats" Grid.Column="8" Grid.Row="2" Text="{Binding Partnership}" AttachedBehaviors:TextBoxBehavior.IsInteger="True"/>
                                            </Grid>
 
 
                                            <Grid Grid.Row="2">
 
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                </Grid.RowDefinitions>
 
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="Auto"/>
                                                    <ColumnDefinition Width="50"/>
                                                    <ColumnDefinition Width="Auto"/>
                                                    <ColumnDefinition Width="Auto"/>
                                                </Grid.ColumnDefinitions>
 
                                                <TextBlock Grid.Row="0" Grid.Column="0" Text="Раны:" Margin="5"/>
                                                <TextBox Text="{Binding Wounds}" Grid.Row="0" Grid.Column="1" Margin="5"/>
                                                <TextBlock Grid.Row="0" Grid.Column="2" Text="Скорость:" Margin="5"/>
                                                <xctk:MaskedTextBox Grid.Row="0" Grid.Column="3" Text="{Binding Speed}" Mask="00/00/00/00"/>
 
                                            </Grid>
 
 
                                            <Grid Grid.Row="3">
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                    <RowDefinition Height="Auto"/>
                                                </Grid.RowDefinitions>
                                                <Expander Grid.Row="0" Margin="5" Header="Описание" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox FontSize="14" Text="{Binding Description}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="1" Margin="5" Header="Умения" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox Text="{Binding Skills}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="2" Margin="5" Header="Таланты" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox Text="{Binding Talents}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="3" Margin="5" Header="Броня и Оружие" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <Grid.RowDefinitions>
                                                            <RowDefinition Height="Auto"/>
                                                            <RowDefinition Height="Auto"/>
                                                            <RowDefinition Height="Auto"/>
                                                            <RowDefinition Height="Auto"/>
                                                        </Grid.RowDefinitions>
                                                        <TextBlock Grid.Row="0" Text="Броня" FontSize="14"/>
                                                        <TextBox Grid.Row="1" Text="{Binding Armor}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="50"/>
                                                        <TextBlock Grid.Row="2" Text="Оружие" FontSize="14"/>
                                                        <TextBox Grid.Row="3" Text="{Binding Weapons}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="50"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="4" Margin="5" Header="Оборудование" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox Text="{Binding Equipment}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="5" Margin="5" Header="Особенности" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox Text="{Binding Features}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                                <Expander Grid.Row="6" Margin="5" Header="Дополнительнрые особенности" FontSize="16" Padding="5" BorderBrush="LightBlue" BorderThickness="2">
                                                    <Grid>
                                                        <TextBox Text="{Binding AdditionalFeatures}" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" MinHeight="100"/>
                                                    </Grid>
                                                </Expander>
                                            </Grid>
                                        </Grid>
                                    </ScrollViewer>
                                    <Grid Grid.Row="1">
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="*"/>
                                            </Grid.ColumnDefinitions>
                                            <Button Grid.Column="0" Content="Добавить" Margin="1" Command="{Binding AddCommand}"/>
                                            <Button Grid.Column="1" Content="Изменить" Margin="1" Command="{Binding EditCommand}" CommandParameter="{Binding ElementName=ListViewBestiaryAddEditChange, Path=SelectedItem}"  />
                                            <Button Grid.Column="2" Content="Удалить" Margin="1" Command="{Binding DeleteCommand}" CommandParameter="{Binding ElementName=ListViewBestiaryAddEditChange, Path=SelectedItem}"  />
                                        </Grid>
                                    </Grid>
                                </Grid>
                            </Grid>
</Window>
Миниатюры
Как обнулить значения TextBox в команде после сохранения их в БД   Как обнулить значения TextBox в команде после сохранения их в БД  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.03.2023, 15:34
Ответы с готовыми решениями:

Как после выполнения процедуры, обнулить значения Request-a?
Ситуация следующая: при передачи значений формы POST методом, по значению поля определяется процедура формирования данных в таблице....

Как обнулить значение textbox?
Вводишь год - нажимаешь кнопочку - получаешь ответ Когда хочешь ввести новое значение, ответ в текстовом боксе не убирается до нажатия...

Сохранения значения slect после обновления страницы
Доброго время суток всем! Сразу хочу сказать что в яве я особо не рулю. На каком-то форуме нашел подходящий скрипт и попробывал его...

134
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
31.03.2023, 12:38
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Количество таблиц не влияет на правильность и логичность написания взаимодействия с данными
Влияет на сложность.
"Правильная" реализация для простого решения может быть излишне усложнённой.
Если идёт речь об академической задаче, для изучения правильной реализации - то усложнение естественно и оно только на пользу.
Но в данном случае, ТС ищет не "правильное", а "простое" решение.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
01.04.2023, 14:33  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но в данном случае, ТС ищет не "правильное", а "простое" решение.
Я не против сделать правильную архитектуру у приложения, но к сожалению не знаю как это реализовать. Если вы поможете прийти к правильной реализации, то буду только рада, так как я только начинаю все изучать и лучше все делать пока правильно, чтобы знать как нужно
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2023, 14:50
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
Я не против сделать правильную архитектуру у приложения,
Я бы тогда добавил маппер к вашему решению.
Можете взять отсюда: https://github.com/INexteR/New... emo/Mapper

И в режимы обновление/клонирование/добавление переходил явно.
Без перехода в один из режимов регион детализации доступен только для чтения.
А после перехода регион списка отключается.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
01.04.2023, 15:16  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И в режимы обновление/клонирование/добавление переходил явно.
Явно это как? Не совсем поняла. У меня же вроде и так команды отвечают явно за добавление, редактирование или удаление
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2023, 17:16
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
Явно это как?
В обычном режиме - только просмотр.
Кнопки "Редактировать", "Клонировать", "Добавить", "Удалить".
После клика на первые три, регион списка блокируется и кнопки заменяются на "Сохранить" и "Отменить".
После клика по ним - обратно переход в режим просмотра.

Добавлено через 1 минуту
То есть переходы между режимами редактирование-просмотр происходит явно кликам на кнопки.

Добавлено через 1 минуту
Нет такого, что ввёл изменения во время просмотра, или вёл потом пролистнул список и изменения потерялись.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
01.04.2023, 17:33  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Кнопки "Редактировать", "Клонировать", "Добавить", "Удалить".
После клика на первые три, регион списка блокируется и кнопки заменяются на "Сохранить" и "Отменить"
А за что отвечает маппер?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2023, 17:42
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
А за что отвечает маппер?
Отражает один экземпляр на другой не взирая их типы.
Даже анонимные типы переваривает.
Для вашего кода например:
C#
1
bestiaryCreature.CopyFrom(new {Id=123, Name = "Имя"});
Добавлено через 2 минуты
Эта реализация, кроме отражения, ещё вызывает и обновление привязок для изменившихся свойств.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
01.04.2023, 17:55  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Отражает один экземпляр на другой не взирая их типы.
Это поняла, но не знаю как реализовать
Допустим кнопка Добавить. После кнопки добавить заменяем Кнопки "Добавить" и "Удалить" на "Сохранить" и "Отменить"
XML
1
2
3
4
<Button Grid.Column="0" Content="Добавить" Margin="1" Command="{Binding AddCommand}"/>
<Button Grid.Column="2" Content="Удалить" Margin="1" Command="{Binding DeleteCommand}"/>
<Button Grid.Column="0" Content="Сохранить" Margin="1" Command="{Binding Save}" Visibility="Hidden" IsEnabled="False"/>
<Button Grid.Column="0" Content="Отменить" Margin="1" Command="{Binding Cancel}" Visibility="Hidden" IsEnabled="False"/>
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 RelayCommand AddCommand => GetCommand(() =>
        {
 
        });
        public RelayCommand Cancel => GetCommand(() =>
        {
 
        });
 
        /// <summary>Добавление сущности <see cref="BestiaryCreature"/>.</summary>
        public RelayCommand Save => GetCommand(() =>
        {
            var bestCrId = BestiaryCreature.Id;
            // Обнуляем Id и добавляем как новую
            BestiaryCreature.Id = 0;
            db.BestiaryCreatures.Add(BestiaryCreature);
            try
            {
                db.SaveChanges();
                MessageBox.Show("Добавление прошло успешно");
 
                //отменяем выделение элемента ListView
                if (SelectedItem is null)
                    BestiaryCreature = new();
                else
                    SelectedItem = null;
            }
            catch (Exception ex)
            {
                // Здесь обработка ошибок ex
                db.BestiaryCreatures.Remove(BestiaryCreature);
                BestiaryCreature.Id = bestCrId;
                MessageBox.Show("Такое название уже существует");
 
            }
        });
В команде AddCommand делаем кнопку добавить невидимой и неактивной, а Сохранить видимой и активной.
Так примерно?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2023, 19:39
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
Это поняла, но не знаю как реализовать
В первую очередь добавляем в VM свойство с перечислением enum ViewModelMode {View, Update, Add}.
От этого свойства в View уже делаем зависимости показа элементов (кнопок) и режима readonly.

Добавлено через 37 секунд
Тогда мы сможем из методов VM переключать режим как нам нужно.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
01.04.2023, 19:57  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В первую очередь добавляем в VM свойство с перечислением enum ViewModelMode {View, Update, Add}.
От этого свойства в View уже делаем зависимости показа элементов (кнопок) и режима readonly.
Есть какой-нибудь наглядный пример? Не могу разобраться и информации найти в интернете
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2023, 22:42
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
Есть какой-нибудь наглядный пример?
Скинул фиксацию. Смотрите ветку ViewMode.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
01.04.2023, 22:50  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Смотрите ветку ViewMode.
Последняя вроде моя только тут
Миниатюры
Как обнулить значения TextBox в команде после сохранения их в БД  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2023, 23:41
VeronikaKlever, кликните на списке ветвей и выберите ветку ViewMode.



1
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
03.04.2023, 00:30  [ТС]
Элд Хасп
Как теперь должны вызываться команды AddCommand и EditCommand? Или их вовсе нужно переделывать?
И еще вопрос возник с Binding полей класса. Они же теперь не работают

Добавлено через 5 минут
C#
1
2
3
4
5
6
7
8
9
10
11
 public RelayCommand Exit => GetCommand
        (
            () => Mode = ViewMode.View,
            () => SelectedBC is not null
        );
 
        public RelayCommand Save => GetCommand
        (
            () => MessageBox.Show("Сохранение измений"),
            () => SelectedBC is not null
        );
Еще вот в этих двух командах выбранное значение в ListView должно быть не нулевым, но тогда при вызове Add, кнопки остаются заблокированными и не работают. Я правильно понимаю, что они здесь не нужны?

Добавлено через 11 минут
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
И еще вопрос возник с Binding полей класса
Text="{Binding Name}" и т.д.
И они не нужны уже?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
03.04.2023, 00:45
VeronikaKlever, Я вам просто показал навигацию.
Переделайте как вам нужно по логике.

Добавлено через 6 минут
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
RelayCommand Exit => GetCommand
В Exit и Save лишняя проверка условия.
C#
42
43
44
45
46
47
48
49
50
        public RelayCommand Exit => GetCommand
        (
            () => Mode = ViewMode.View
        );
 
        public RelayCommand Save => GetCommand
        (
            () => MessageBox.Show("Сохранение измений"),
        );
В Save вместо MessageBox нужно сделать сохранение EditableBC.
Если есть сущность с таким же id, то перед сохранением надо отсоединить её от Local.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
03.04.2023, 01:02  [ТС]
Элд Хасп
Про навигацию разбираюсь как все устроено. Как я понимаю маппер нужен как раз таки для переделывания команд AddCommand, EditCommand и т.д? Можно пример небольшой реализации маппера в контексте моей работы или вообще общий пример, где применялся этот маппер?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
03.04.2023, 02:01
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
Можно пример небольшой реализации маппера в контексте моей работы или вообще общий пример, где применялся этот маппер?
Вот же он:
C#
12
13
14
15
16
        public RelayCommand Update => GetCommand
        (
            () =>
            {
                EditableBC = SelectedBC!.Create<BestiaryCreature>();
Метод Create<T> - это метод маппера:
C#
46
47
48
49
50
51
52
        public static TTarget Create<TTarget>(this object source, params string[] propertyNames)
               where TTarget : new()
        {
            TTarget item = new();
            item.CopyFrom(source, propertyNames);
            return item;
        }
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
03.04.2023, 21:43  [ТС]
Элд Хасп
Добавила функционал в добавление, редактирование и клонирование
Можно ли было упростить при помощи маппера?
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
public partial class ApplicationViewModel
    {
        BestiaryCreature bestCrOld; //создание локальной переменной используемой в редактировании
        public ViewMode Mode { get => Get<ViewMode>(); private set => Set(value); }
 
        public RelayCommand Update => GetCommand
        (
            () =>
            {
                EditableBC = SelectedBC!.Create<BestiaryCreature>();
                bestCrOld = SelectedBC;
                Mode = ViewMode.Update;
            },
            () => SelectedBC is not null
        );
 
        public RelayCommand Add => GetCommand
        (
            () =>
            {
                EditableBC = new BestiaryCreature();
                Mode = ViewMode.Add;
            }
        );
 
        public RelayCommand Clone => GetCommand
        (
            () =>
            {
                EditableBC = SelectedBC!.Create<BestiaryCreature>();
                EditableBC.Id = 0;
                Mode = ViewMode.Add;
            },
            () => SelectedBC is not null
        );
 
        public RelayCommand Exit => GetCommand
        (
            () =>
            {
                Mode = ViewMode.View;
                SelectedBC = null;
            } 
 
        );
 
        public RelayCommand Save => GetCommand
        (
            () =>
            {
                if (Mode == ViewMode.Add)
                {
                    try
                    {
                        db.BestiaryCreatures.Add(EditableBC);
                        db.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        db.BestiaryCreatures.Remove(EditableBC);
                        MessageBox.Show("Такое название уже существует");
                        return;
                    }
                }
                else
                if (Mode == ViewMode.Update)
                {
                    var bestCr = EditableBC;
                    int index = BestiaryCreatures.TakeWhile(bc => bc.Id != bestCr.Id).Count();
                    try
                    {
                        BestiaryCreatures.RemoveAt(index);
                        BestiaryCreatures.Insert(index, bestCr);
                        db.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        BestiaryCreatures.RemoveAt(index);
                        BestiaryCreatures.Insert(index, bestCrOld);
                        EditableBC = bestCrOld;
                        MessageBox.Show("Такое название уже существует");
                        return;
                    }
                }
                MessageBox.Show("Сохранение прошло успешно");
                Mode = ViewMode.View;
            }
        );
    }
и еще все никак не могу понять как происходит привязка к TextBox ведь пишет, что элемент не найден в контексте данных "ApplicationViewModel", но данные же считываются, а почему понять не могу
Миниатюры
Как обнулить значения TextBox в команде после сохранения их в БД  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
03.04.2023, 22:28
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
Можно ли было упростить при помощи маппера?
Чуть подправил, но здесь нет работы для маппера.
C#
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
    public partial class ApplicationViewModel
    {
        public ViewMode Mode { get => Get<ViewMode>(); private set => Set(value); }
 
        public RelayCommand Update => GetCommand
        (
            () =>
            {
                EditableBC = SelectedBC!.Create<BestiaryCreature>();
                Mode = ViewMode.Update;
            },
            () => SelectedBC is not null
        );
 
        public RelayCommand Add => GetCommand
        (
            () =>
            {
                EditableBC = new BestiaryCreature();
                Mode = ViewMode.Add;
            }
        );
 
        public RelayCommand Clone => GetCommand
        (
            () =>
            {
                EditableBC = SelectedBC!.Create<BestiaryCreature>();
                EditableBC.Id = 0;
                Mode = ViewMode.Add;
            },
            () => SelectedBC is not null
        );
 
        public RelayCommand Exit => GetCommand
        (
            () =>
            {
                Mode = ViewMode.View;
                SelectedBC = null;
            }
        );
 
        public RelayCommand Save => GetCommand
        (
            () =>
            {
                if (Mode == ViewMode.Add)
                {
                    if (db.BestiaryCreatures.Find(EditableBC.Id) is null)
                    {
                        MessageBox.Show("Такое Id уже существует");
                    }
                    else
                    {
                        EntityEntry<BestiaryCreature> entry = db.BestiaryCreatures.Add(EditableBC);
                        try
                        {
                            db.SaveChanges();
                        }
                        catch (Exception ex)
                        {
                            entry.State = EntityState.Detached;
                            MessageBox.Show("Такое название уже существует");
                            return;
                        }
                    }
                }
                else if (Mode == ViewMode.Update)
                {
                    int index = BestiaryCreatures.TakeWhile(bc => bc.Id != EditableBC.Id).Count();
                    if (index < 0)
                    {
                        MessageBox.Show("Такого Id не существует");
                    }
                    else
                    {
                        BestiaryCreature bestCrOld = BestiaryCreatures[index];
                        try
                        {
                            BestiaryCreatures[index] = EditableBC;
                            db.SaveChanges();
                        }
                        catch (Exception ex)
                        {
                            BestiaryCreatures[index] = bestCrOld;
                            MessageBox.Show("Такое название уже существует");
                            return;
                        }
                    }
                }
                MessageBox.Show("Сохранение прошло успешно");
                Mode = ViewMode.View;
            }
        );
    }
Цитата Сообщение от VeronikaKlever Посмотреть сообщение
как происходит привязка к TextBox ведь пишет, что элемент не найден в контексте данных "ApplicationViewModel"
Из-за установки Контекста Данных в сеттерах стиля Дизайнер XAML не может верно определить какой тип в нём находится.
Нужно явно задать тип для Времени Разрабоки:
XML
59
60
<Grid x:Name="GridStatsEnter" Background="Gray"
    d:DataContext="{d:DesignInstance Type=models:BestiaryCreature}">
Добавлено через 1 минуту
Фиксацию отправил.
0
1 / 1 / 0
Регистрация: 04.05.2021
Сообщений: 156
10.04.2023, 14:57  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
if (db.BestiaryCreatures.Find(EditableBC.Id ) is null)
                    {
                        MessageBox.Show("Такое Id уже существует");
                    }
Не совсем понимаю зачем нужна эта проверка, ведь с ней просто не работает добавление

Добавлено через 2 минуты
Еще возник вопрос как заблокировать ввод текста пока пользователю пока он не переключиться в какой-то режим (Add, Clone, Update)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2023, 14:57

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

Отобразить текст в Textbox из другого TextBox в разных кодировках без сохранения в файл
Доброго всем времени суток! Есть на форме несколько Textbox&quot;сов. В 1-й Textbox вписывается текст как образец, а в остальных этот же...

После нажатия кнопки "остановить" не получается обнулить значения
Здравстуйте! Делали курсовик с другом и столкнулись с одной проблемой, мы после нажатия кнопки &quot;остановить&quot; не можем обнулить...

Visual Studio Code Есть ли поддержка сохранения файла в 2х местах или запуска батника после сохранения
Здравствуйте. Кто знает есть ли в Visual Studio Code возможность сохранять файцл в 2х местах или запускать определенный батник после...

TextBox color - Как окрасить на форме TextBox от разного значения
Всем привет У меня вопрос по VB. На форме много TextBox и окрашивать их по индивидуальному значению получается достаточно громоздкий код....


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера 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 Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru