从ViewModel关闭子窗口

时间:2017-04-08 12:35:12

标签: wpf mvvm

我在ViewModel中有取消命令。

绑定到子视图中的通道按钮。

当我按下取消按钮时,它将清除viewModel中所有未保存的数据。

此外,我必须关闭子窗口的当前实例。 - 这是我被卡住的地方。

我正在使用MVVM。

2 个答案:

答案 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>