使用MVVM实现“关闭窗口”命令

44
所以我的第一次尝试是在代码后端完成所有操作,现在我正在尝试重构我的代码以使用MVVM模式,遵循MVVM in the box信息的指导。
我创建了一个与我的视图类匹配的视图模型类,并且正在将代码从代码后端移动到视图模型,从命令开始。
我的第一个问题是尝试实现一个“关闭”按钮,如果数据没有被修改,则关闭窗口。 我已经设置了一个CloseCommand来替换“onClick”方法,一切都很好,除了代码尝试运行this.Close()的地方。 显然,由于代码已从窗口移动到普通类,'this'不是一个窗口,因此无法关闭。 但是,根据MVVM,视图模型不知道视图,因此我无法调用view.Close()
有人能建议我如何从视图模型命令关闭窗口吗?

1
已经讨论了几个选项[https://dev59.com/B2855IYBdhLWcg3wYTP_][在这里]。通常我会使用CommandParameter和相对源返回到调用的窗口的方法。(正如Simone所演示的那样) - Steve Py
这个解决方案需要使用Expression Blend吗?我在这方面有些困难。 - mcalex
请查看此处如何使用附加属性来解决此问题:http://blog.excastle.com/2010/07/25/mvvm-and-dialogresult-with-no-code-behind/ - dvvrd
13个回答

0

给定一种方法,请进行检查

https://dev59.com/nXRB5IYBdhLWcg3wz6ad#30546407

简短描述

  1. 从INotifyPropertyChanged派生您的ViewModel
  2. 在ViewModel中创建一个可观察属性CloseDialog,每当您想关闭对话框时更改CloseDialog属性。
  3. 在View中为此属性更改附加处理程序
  4. 现在你几乎完成了。在事件处理程序中将DialogResult设置为true

0

0

首先给你的窗口起一个名字,比如

x:Name="AboutViewWindow"

在我的关闭按钮上,我已经定义了命令和命令参数,如下:
CommandParameter="{Binding ElementName=AboutViewWindow}"
Command="{Binding CancelCommand}"

那么在我的视图模型中

private ICommand _cancelCommand;        
public ICommand CancelCommand       
{
   get          
     {
        if (_cancelCommand == null)
           {
              _cancelCommand = new DelegateCommand<Window>(
                    x =>
                    {
                        x?.Close();
                    });
            }

            return _cancelCommand;          
     }      
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接