2012-06-15 23 views
4

我有一个窗口,它承载各种用户控件的页面。是否可以在usercontrol的datacontext中关闭我没有提及的窗口? 简化的细节:如何从其用户控件视图模型关闭窗口?

SetupWindow

public SetupWindow() 
    { 
     InitializeComponent(); 
     Switcher.SetupWindow = this; 
     Switcher.Switch(new SetupStart()); 
    } 

    public void Navigate(UserControl nextPage) 
    { 
     this.Content = nextPage; 
    } 

SetupStart用户控件

<UserControl x:Class="..."> 
<UserControl.DataContext> 
    <local:SetupStartViewModel/> 
</UserControl.DataContext> 
<Grid> 
    <Button Content="Continue" Command="{Binding ContinueCommand}"/> 
</Grid> 
</UserControl> 

SetupStartViewModel

public SetupStartViewModel() 
    { 
    } 

    private bool canContinueCommandExecute() { return true; } 

    private void continueCommandExectue() 
    { 
     Switcher.Switch(new SetupFinish()); 
    } 

    public ICommand ContinueCommand 
    { 
     get { return new RelayCommand(continueCommandExectue, canContinueCommandExecute); } 
    } 
+0

问题可能重复http://stackoverflow.com /问题/ 1484233/WPF的MVVM闭-A-视图从 - 视图模型。 – 2012-06-15 10:24:05

+0

非常好的问题,真的。 – Vlad

回答

5

我设法找到一个答案在这里的解决方案:How to bind Close command to a button

视图模型:

public ICommand CloseCommand 
{ 
    get { return new RelayCommand<object>((o) => ((Window)o).Close(), (o) => true); } 
} 

查看:

<Button Command="{Binding CloseCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Content="Close"/> 
3

内,您的用户控件,你可以找到一个与托管它的窗口的引用窗口上的静态方法c姑娘。

var targetWindow = Window.GetWindow(this); 
targetWindow.Close(); 

编辑:

如果你有没有提到该数据上下文你正在使用没有一个庞大的选择量,如果只是1个应用程序窗口的用户控件你可以逃脱

Application.Current.MainWindow.Close() 

如果有多个窗口在您的应用程序和一个要关闭的焦点,你可以找到的东西,如

public Window GetFocusWindow() 
{ 
    Window results = null; 
    for (int i = 0; i < Application.Current.Windows.Count; i ++) 
     if (Application.Current.Windows[i].IsFocused) 
     { 
      results = Application.Current.Windows[i]; 
      break; 
     } 
    return results; 
} 

最后我想(虽然这很漂亮),你可以遍历应用程序窗口类,检查视觉树中每个对象的数据上下文,直到找到你想要的引用,窗口可以是从那里关闭。

+1

我通常最终会在视图模型,RequestClose或类似的东西中编写我自己的事件,用户控件会监听这些事件。然后它关闭事件的窗口。只是为了避免将用户控件/窗口引用传递给视图模型。 :) –

+1

这不是我的问题的答案,我知道如何在代码隐藏 – user13070

+0

@ user13070中执行此操作然后创建事件并在需要关闭窗口时将其提升。然后在侦听所述事件的方法中从代码隐藏中关闭它。 :)当然,这需要你连接事件,最好在控件的构造函数中。但我没有更好的主意。 –

5

我这样做是通过在ViewModel中有一个RequestClose事件来实现的,它可以在视图关闭时引发。

然后通过创建窗口的代码连接到窗口的Close()命令。例如

var window = new Window(); 
var viewModel = new MyViewModel(); 

window.Content = viewModel; 
viewModel.RequestClose += window.Close; 

window.Show() 

这样所有的窗口创建工作都在一个地方进行。视图或视图模型都不知道窗口。

+0

我的窗口没有编程创建,我没有提及它,因为我提到 – user13070

+0

东西必须创建窗口。那应该是控制窗口寿命。您的UserControl不应该了解Windows,它甚至可能不在窗口中托管。 – GazTheDestroyer

+0

是的,我弄错了,不知道我的意思。但是我可以添加此事件,但是如何从我的视图模型(这是用户控件的后面)触发该事件 – user13070

相关问题