使用我的自定义UserControl
作为内容创建一个这样的窗口:
Window newCacheForm = new Window
{
Title = "Add New Cache Tag",
Content = new NewCacheControl()
};
我想打开Window
作为对话框并获得结果:
var result = newCacheForm.ShowDialog();
我有适当的代码绑定并将对话框设置为true或false,但是如何从UserControl
ViewModel关闭Window?如果无法做到这一点,我该如何以MVVM友好的方式工作呢?
答案 0 :(得分: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;
}
}
在创建新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!");
}
}
在UserControl
的关闭处理程序中写下这个:
private void Close_Click(object sender, RoutedEventArgs e)
{
TestModel testModel = this.DataContext as TestModel;
testModel.IsClose = true;
}
当然,应该使用命令来代替按钮的Click
处理程序。
整个项目可用
here
。