2017-04-08 145 views
0

我在ViewModel中有取消命令。从ViewModel关闭子窗口

这势必会在子视图烛按钮。

当我按下取消按钮会清除视图模型我所有未保存的数据。

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

我使用MVVM。

+0

张贴一些代码,请。至少,您的ViewModel和View代码。查看https://stackoverflow.com/help/mcve寻求帮助,撰写出色的问题。 –

+0

你是怎么打开这个窗口的? – Emad

+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; 
} 

和窗口基类我查看我想告诉和关闭通过视图模型

public class ClosableWindow : Window 
{ 
    public ClosableWindow(IClosableViewModel viewModel) 
    { 
     DataContext = viewModel; 
     viewModel.Close += (s, e) => Close(); 
    } 
} 

您的视图模型是在DataContext从您的视图要显示为d ialog必须从ClosableViewModel继承,并且您的对话框必须从ClosableWindow继承。当你想从ViewModel关闭视图时,只需调用CloseView方法即可。

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>