Страницы

Поиск по вопросам

понедельник, 10 февраля 2020 г.

Команда кнопки “ОК” дочернего окна, закрывающего его. MVVM WPF

#c_sharp #wpf #mvvm


Создание и показ дочернего окна из MainViewModel:

    public ICommand OpenWindow_AddNewBid_Command => new RelayCommand(p =>
OpenWindow_AddNewBid());
    private void OpenWindow_AddNewBid()
    {            
        var wnd = new AddNewBidWindow();           
        if (wnd.ShowDialog() == true)
        {
            AddNewBidViewModel vm = (AddNewBidViewModel)wnd.DataContext;
            AddNewBidToCollection(vm.CreatedBid);
        }
    }


В ViewModel дочернего окна есть команда, которая привязана к кнопке OK.

    public ICommand AddNewBidCommand => new RelayCommand(p => AddNewBid(),
                                                                 p => IsValid);


XAML:




Не могу понять, как сделать, что бы выполнилась команда привязанная к кнопке и окно
закрылось?
    


Ответы

Ответ 1



Самый простой вариант, не нарушающий принципы MVVM. View: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var vm = new MainViewModel(); this.DataContext = vm; vm.CloseHandler += (sender, args) => this.Close(); } } ViewModel: public class MainViewModel : BindableBase { public EventHandler CloseHandler; public ICommand AddNewBidCommand => new RelayCommand(action => { // ... var handler = CloseHandler; if (handler != null) handler.Invoke(this, EventArgs.Empty); }, canExecute => true); } Вариант с передачей экземпляра окна в команду через CommandParameter возможен, но будет нарушать принципы MVVM.

Ответ 2



Изящный вариант закрытия окна из VM в духе MVVM (декларативный и через биндинги) Вспомогательный класс public static class DialogCloser { public static readonly DependencyProperty DialogResultProperty = DependencyProperty.RegisterAttached( "DialogResult", typeof (bool?), typeof (DialogCloser), new PropertyMetadata(DialogResultChanged)); private static void DialogResultChanged( DependencyObject d, DependencyPropertyChangedEventArgs e) { var window = d as Window; if (window != null) { window.DialogResult = e.NewValue as bool?; if (window.DialogResult != null) window.Close(); } } public static void SetDialogResult(Window target, bool? value) { target.SetValue(DialogResultProperty, value); } } VM class MyViewModel { private bool? _dialogResult; public bool? DialogResult { get { return _dialogResult; } protected set { _dialogResult = value; OnPropertyChanged("DialogResult"); } } public ICommand OkCommand {get;}=new RelayCommand(Save); private void Save() { .... DialogResult = true; } } XAML При выставлении у VM DialogResult=true/false форма закроется и у нее будет установлен DialogResult, так что проверка результата будет работать if(view.ShowDialog()==true)..

Комментариев нет:

Отправить комментарий