Задать вопрос
@Jaguar_sea

Как правильно организовать добавление и редактирование по нажатии одной кнопки?

Здравствуйте, пытаюсь разобраться Entity Framework.
В моем проекте есть две вьюшки...
MainWindow

<Window x:Class="CashReg.Client.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local ="clr-namespace:CashReg.View.ViewModel"
        Title="MainWindow" Height="350" SizeToContent="Width" WindowStartupLocation="CenterScreen">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <ToolBar>
            <Button Content="Добавить" Command="{Binding Path=OpenChildBankWin}" />
            <Button Content="Исправить"/>
            <Button Content="Удалить" Command="{Binding Path=DeleteBank}"/>
        </ToolBar>
        <DataGrid ItemsSource="{Binding Banks}" 
                  AutoGenerateColumns="False" 
                  Grid.Row="1" 
                  IsReadOnly="True"
                  SelectedItem="{Binding SelectBank}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding city}" Header="Город"/>
                <DataGridTextColumn Binding="{Binding Name}" Header="Название"/>
                <DataGridTextColumn Binding="{Binding bik}" Header="БИК"/>
                <DataGridTextColumn Binding="{Binding kor_acc}" Header="Корр. счет"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>



AddOrEditBank

<Window x:Class="CashReg.View.View.AddOrEditBank"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Добавление..." ResizeMode="CanResizeWithGrip"  SizeToContent="WidthAndHeight">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        
        <TextBlock Text="Город:" Grid.Row="0" Grid.Column="0" Margin="5"/>
        <TextBox Text="{Binding Path=CurrentBank.city, UpdateSourceTrigger=PropertyChanged}"  Grid.Row="0" Grid.Column="1"  Margin="5" Width="150"/>

        <TextBlock Text="Банк:" Grid.Row="1" Grid.Column="0"  Margin="5"/>
        <TextBox Text="{Binding Path=CurrentBank.Name, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="1"  Margin="5" Width="150"/>

        <TextBlock Text="БИК:" Grid.Row="2" Grid.Column="0"  Margin="5"/>
        <TextBox Text="{Binding Path=CurrentBank.bik, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1"  Margin="5" Width="150"/>

        <TextBlock Text="Корр. счет:" Grid.Row="3" Grid.Column="0"  Margin="5"/>
        <TextBox Text="{Binding Path=CurrentBank.kor_acc, UpdateSourceTrigger=PropertyChanged}" Grid.Row="3" Grid.Column="1"  Margin="5" Width="150"/>

        <Button Grid.Row="4" Grid.Column="0" Content="OK" IsDefault="True"  Margin="5" Command="{Binding Path=OkBankChildWin}"/>
        <Button Grid.Row="4" Grid.Column="1" Content="Отмена" IsCancel="True"  Margin="5" HorizontalAlignment="Left" Padding="7,0"/>
    </Grid>
</Window>


И следующий код во ViewModel
ViewModel

public class MainWindowViewModel : ViewModelBase
    {
        private CashRegContext DbContext;

        public ObservableCollection<Bank> Banks { get; private set; }

        public MainWindowViewModel()
        {
            DbContext = new CashRegContext();
            Banks = new ObservableCollection<Bank>(DbContext.Banks);
        }


        #region Получение выделенной строки
        private Bank selectBank;
        public Bank SelectBank
        {
            get
            {
                return this.selectBank;
            }
            set
            {
                this.selectBank = value;
                this.OnPropertyChanged("SelectBank");
            }
        }
        #endregion


        #region Новый банк
        private Bank currentBank;
        public Bank CurrentBank
        {
            get 
            {
                if (this.currentBank == null)
                    currentBank = new Bank();
                return this.currentBank; 
            }
            set
            {
                this.currentBank = value;
                this.OnPropertyChanged("CurrentBank");
            }
        }
        #endregion

        #region Открытие дочернего окна
        private RelayCommand _openChildBankWin;
        public RelayCommand OpenChildBankWin
        {
            get
            {
                if (_openChildBankWin == null)
                    _openChildBankWin = new RelayCommand(executeOpenChildBankWin);

                return _openChildBankWin;
            }
        }

        AddOrEditBank ChildBankWin;
        private void executeOpenChildBankWin(object parameter)
        {
            ChildBankWin = new AddOrEditBank(this);
            ChildBankWin.ShowDialog();
        }
        #endregion

        #region Нажитие кнопки ОК в диалоговом окне добавления банка
        private RelayCommand _okBankChildWin;
        public ICommand OkBankChildWin
        {
            get
            {
                if (_okBankChildWin == null)
                    _okBankChildWin = new RelayCommand(OkSaveChildWindowImplementation, CanExecuteAddBankCommand);

                return _okBankChildWin;
            }
        }

        private bool CanExecuteAddBankCommand(object obj)
        {
            if (string.IsNullOrEmpty(CurrentBank.city) ||
                string.IsNullOrEmpty(CurrentBank.Name) ||
                string.IsNullOrEmpty(CurrentBank.bik) ||
                string.IsNullOrEmpty(CurrentBank.kor_acc))
                return false;
            return true;
        }

        private void OkSaveChildWindowImplementation(object parameter)
        {
            Banks.Add(CurrentBank);
            DbContext.Banks.Add(CurrentBank);
            DbContext.SaveChanges();
            currentBank = null;
            ChildBankWin.Close();
        }
        #endregion

        #region Удаление строки
        private RelayCommand _deleteBank;
        public ICommand DeleteBank
        {
            get
            {
                if (_deleteBank == null)
                    _deleteBank = new RelayCommand(DeleteBankImplementation, CanExecuteDeleteBankCommand);

                return _deleteBank;
            }
        }

        private bool CanExecuteDeleteBankCommand(object obj)
        {
            if (SelectBank == null)
                return false;
            return true;
        }

        private void DeleteBankImplementation(object parameter)
        {
            if (MessageBox.Show("Удалить запись?",
                 "Удаление...",
                 MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                DbContext.Banks.Remove(SelectBank);
                Banks.Remove(SelectBank);
                SelectBank = null;
                DbContext.SaveChanges();
            }
        }
        #endregion

        protected override void OnDispose()
        {
            this.Banks.Clear();
        }


Как правильно организовать события "Добавления" и "Редактировани" записи? На данный момент добавление работает корректно. Но я ни как не пойму как сделать так что бы при нажатии кнопки "Редактировать" выводилось то же самое окно что и в случае нажатия кнопки "Добавить", только с заполнеными данными полями и с кнопкой "Ок", binding котрой приводил бы к редактированию, а не добавлению...?
  • Вопрос задан
  • 2484 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@Gilga
В ViewModel добавить поле bool IsNew. Делаешь новую команду для редактирования.

private void executeOpenChildBankWin(object parameter)
        {
            IsNew = true;
            ChildBankWin = new AddOrEditBank(this);
            ChildBankWin.ShowDialog();
        }

private void OkSaveChildWindowImplementation(object parameter)
        {
            if(IsNew)
            {
                  Banks.Add(CurrentBank);
                  DbContext.Banks.Add(CurrentBank);
            }            
            DbContext.SaveChanges();
            ChildBankWin.Close();
        }

Если ты начал писать mvvm, то копай о DelegateCommand.cs
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы