Закрытие окна из ViewModel его содержимого в MVVM WPF?
Создание такого окна, используя мой пользовательский UserControl в качестве содержимого:
Window newCacheForm = new Window
{
Title = "Add New Cache Tag",
Content = new NewCacheControl()
};
Я хочу открыть Window как диалог и получить результат:
var result = newCacheForm.ShowDialog();
У меня есть код для привязки и установки диалогового окна в true или false, но как закрыть окно из UserControl ViewModel? Если это невозможно сделать, как я могу работать с этим дружественным способом MVVM?
1 ответ:
В этом случае я бы использовал присоединенное поведение, оно позволяет использовать независимую логику на стороне
View. Я лично его не создавал, но взялhereи немного дополнено-добавленоGet()к свойству зависимостей.Ниже в качестве полного кода этого поведения:
public static class WindowCloseBehaviour { public static bool GetClose(DependencyObject target) { return (bool)target.GetValue(CloseProperty); } public static void SetClose(DependencyObject target, bool value) { target.SetValue(CloseProperty, value); } public static readonly DependencyProperty CloseProperty = DependencyProperty.RegisterAttached("Close", typeof(bool), typeof(WindowCloseBehaviour), new UIPropertyMetadata(false, OnClose)); private static void OnClose(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if (e.NewValue is bool && ((bool)e.NewValue)) { Window window = GetWindow(sender); if (window != null) window.Close(); } } private static Window GetWindow(DependencyObject sender) { Window window = null; if (sender is Window) window = (Window)sender; if (window == null) window = Window.GetWindow(sender); return window; } }В обработчике щелчка creating new
Windowя добавил такое поведение:private void Create_Click(object sender, RoutedEventArgs e) { Window newCacheForm = new Window { Title = "Add New Cache Tag", Content = new TestUserControl(), DataContext = new TestModel() // set the DataContext }; var myBinding = new Binding(); // create a Binding myBinding.Path = new PropertyPath("IsClose"); // with property IsClose from DataContext newCacheForm.SetBinding(WindowCloseBehaviour.CloseProperty, myBinding); // for attached behavior var result = newCacheForm.ShowDialog(); if (result == false) { MessageBox.Show("Close Window!"); } }И в обработчике Close
UserControlнапишите следующее:private void Close_Click(object sender, RoutedEventArgs e) { TestModel testModel = this.DataContext as TestModel; testModel.IsClose = true; }Естественно, вместо
Clickобработчиков для кнопок должны использоваться команды.Доступен весь проект
here.
Comments