我在ViewModel中有取消命令。
绑定到子视图中的通道按钮。
当我按下取消按钮时,它将清除viewModel中所有未保存的数据。
此外,我必须关闭子窗口的当前实例。 - 这是我被卡住的地方。
我正在使用MVVM。
答案 0 :(得分:1)
我使用以下模式。
我的ViewModel基类是
public abstract class ClosableViewModel : IClosableViewModel
{
public event EventHandler Close;
protected virtual void CloseView()
{
var handler = Close;
if (handler != null) handler(this, EventArgs.Empty);
}
}
正在实现此接口
public interface IClosableViewModel
{
event EventHandler Close;
}
我的View的窗口基类我希望通过ViewModel显示和关闭
public class ClosableWindow : Window
{
public ClosableWindow(IClosableViewModel viewModel)
{
DataContext = viewModel;
viewModel.Close += (s, e) => Close();
}
}
您希望显示为对话框的ViewConode中的DataContext必须从ClosableViewModel
继承,并且您的对话框必须从ClosableWindow
继承。如果要从ViewModel关闭View,只需调用CloseView
方法即可。
答案 1 :(得分:1)
使用事件的替代方法是视图上的附加属性。属性更改处理程序将找到视图的父窗口,并在识别出特定值时立即关闭它。
using System.Windows;
namespace WpfApp1
{
public class CloseSignal
{
public static readonly DependencyProperty SignalProperty =
DependencyProperty.RegisterAttached("Signal", typeof(bool), typeof(CloseSignal),
new PropertyMetadata(OnSignalChanged));
public static bool GetSignal(DependencyObject dp)
{
return (bool)dp.GetValue(SignalProperty);
}
public static void SetSignal(DependencyObject dp, bool value)
{
dp.SetValue(SignalProperty, value);
}
private static void OnSignalChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
{
if (!(bool)e.NewValue)
return;
Window parent = Window.GetWindow(dp);
if (parent != null)
parent.Close();
}
}
}
视图的XAML看起来像......
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1"
Title="MainWindow" Height="350" Width="525"
local:CloseSignal.Signal="{Binding Signal}">
...
</Window>