如何从用户控件视图模型中关闭窗口?

use*_*070 4 c# wpf datacontext user-controls viewmodel

我有一个窗口,托管各种UserControl作为页面.是否可以在usercontrol的datacontext中关闭我没有引用的窗口?简化细节:

SetupWindow

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

    public void Navigate(UserControl nextPage)
    {
        this.Content = nextPage;
    }
Run Code Online (Sandbox Code Playgroud)

SetupStart UserControl

<UserControl x:Class="...">
 <UserControl.DataContext>
    <local:SetupStartViewModel/>
 </UserControl.DataContext>
 <Grid>
    <Button Content="Continue" Command="{Binding ContinueCommand}"/>
 </Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

SetupStartViewModel

    public SetupStartViewModel()
    {
    }

    private bool canContinueCommandExecute() { return true; }

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

    public ICommand ContinueCommand
    {
        get { return new RelayCommand(continueCommandExectue, canContinueCommandExecute); }
    }
Run Code Online (Sandbox Code Playgroud)

Gaz*_*yer 5

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

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

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

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

window.Show()
Run Code Online (Sandbox Code Playgroud)

这样,所有与窗口创建有关的东西都在一个地方处理.视图或视图模型都不知道窗口.


use*_*070 5

我设法从这里找到答案的解决方案:如何将关闭命令绑定到按钮

视图模型:

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

视图:

<Button Command="{Binding CloseCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Content="Close"/>
Run Code Online (Sandbox Code Playgroud)