#c_sharp #wpf #mvvm
Создание и показ дочернего окна из MainViewModel: public ICommand OpenWindow_AddNewBid_Command => new RelayCommand
Ответы
Ответ 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)..
Комментариев нет:
Отправить комментарий