如何从 mvvm 中的视图模型关闭视图?
Posted
技术标签:
【中文标题】如何从 mvvm 中的视图模型关闭视图?【英文标题】:How can i close a view from view model in mvvm? 【发布时间】:2017-08-17 21:51:34 【问题描述】:我正在使用带有 MVVM 模式的 WPF。我想从 viewmodel 关闭一个窗口。我尝试使用以前的一些问题的解决方案,但它不起作用。
这是我的代码:
视图模型:
//Defining commands
public RelayCommand SaveAddBankCommand get; private set;
//Constructor
public AddBankVM()
//Initializing Commands
SaveAddBankCommand = new RelayCommand(SaveAddBank);
//Commands methods
public void SaveAddBank(object parameter)
new Banks().AddBank(this.BankName, _Status, System.Convert.ToDouble(Credit), this.Notes);
new Done("Bank has been added successfully.");
//here i want to close the window.
查看类:
public partial class AddBankView : Window
public AddBankView()
InitializeComponent();
var addBankVM = new AddBankVM();
this.DataContext = addBankVM;
【问题讨论】:
有很多方法可以做到这一点。您需要提供一些代码来向我们展示您为什么要这样做。然后我们可以帮助您。 我已经编辑了这个问题。你可以看看我的代码。 您的 ViewModel 中确实有一个窗口实例,对,所以只需yourWindow.Close();
【参考方案1】:
好的。这是一种方法:
在视图模型中...
//Commands methods
public void SaveAddBank()
new Banks().AddBank(this.BankName, _Status, System.Convert.ToDouble(Credit), this.Notes);
new Done("Bank has been added successfully.");
//here i want to close the window.
CloseWindowEvent?.Invoke(this, EventArgs.Empty);
public event EventHandler CloseWindowEvent;
在初始化后面的代码中...
InitializeComponent();
DataContext = new AddBankVM();
(DataContext as AddBankVM).CloseWindowEvent += CommandBench_CloseWindowEvent;
最后是后面代码中的事件处理程序……
private void CommandBench_CloseWindowEvent(object sender, EventArgs e)
Close();
从概念上讲,正在发生的事情是视图模型正在向窗口发送事件以关闭自身。
我怀疑 MVVM 风格的警察在使用这种方法时会遇到一些问题。让我们看看我们是否收到他们的消息。
【讨论】:
【参考方案2】:最简单的方法是引入接口:
public interface IClosable
void Close();
然后,您需要在代码隐藏中更改的唯一一件事就是指定窗口实现IClosable
:
public partial class MainWindow : Window, IClosable
public MainWindow()
InitializeComponent();
XAML:
<Button Width="50"
Height="20"
Command="Binding CloseCommand"
CommandParameter="Binding RelativeSource=RelativeSource FindAncestor,
AncestorType=x:Type Window"
Content="Close" />
视图模型:
#region Commands
public DelegateCommand<IClosable> CloseCommand => new DelegateCommand<IClosable>(Close, CanClose);
private bool CanClose(IClosable parameter)
return true;
private void Close(IClosable parameter)
var closable = parameter as IClosable;
if (closable != null)
closable.Close();
或者,您可以使用 EventTigger、行为或附加行为,但恕我直言,它不那么简单。
【讨论】:
【参考方案3】:在此链接中,您将找到从视图模型打开和关闭对话框的出色机制。 https://www.youtube.com/watch?v=OqKaV4d4PXg
【讨论】:
以上是关于如何从 mvvm 中的视图模型关闭视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 MVVM 灯光从 CustomControl 引用视图模型
iOS:如何使用 MVVM 将模型从视图模型传递到视图模型?
是否可以使用 MVVM 从视图修改视图模型中的属性? [复制]