我刚看完“Practical MVVM by Joel Cochran”视频解释MVVM,我不明白一个关键问题。
在视频中Joel解释View不知道ViewModel,但是按钮仍然绑定到ViewModel中的命令,因此每次按下按钮时,都会执行命令操作。
我的问题是如果我需要专门将按钮绑定到ViewModel命令,View是如何不知道ViewModel的,如:
private ICommand _searchByNameCommand;
public ICommand SearchByNameCommand
{
get
{
if (_searchByNameCommand == null)
{
_searchByNameCommand = new RelayCommand(
p => this.LoadRealEstateCollectionByName(),
p => { return !String.IsNullOrEmpty(this.SearchOwnerName); }
);
}
return _searchByNameCommand;
}
}
在xaml中:
<Button Content="Search"
Grid.Column="2"
VerticalAlignment="Center"
Command="{Binding SearchByNameCommand, Mode=OneWay}" />
SearchByNameCommand在ModelView中定义。
答案 0 :(得分:2)
答案如下:
使用MVVM,视图通过它的DataContext与视图模型紧密耦合。 视图与其视图模型紧密耦合的原因是视图必须指定其DataContext中包含的可观察属性和命令的特定名称。仅此功能就引入了紧密耦合。
<强> RANT:强>
我不确定我是否同意一种完全不了解其视图模型依赖性的观点。
想一想。视图绑定到其数据上下文(也称为视图模型)的状态和操作。换句话说,它紧密耦合到视图模型的状态,而不是视图模型的自身?
重点是什么?
如果视图完全依赖于其数据上下文(即可观察状态和视图模型的公开命令),那么从视图中隐藏视图模型有多大用处?
答案 1 :(得分:0)
我认为你有点误解了什么&#34;没有意识到&#34;实际意味着在这种情况下。在winforms编程中,当你有一个按钮并想要订阅click事件时,你必须附加一个事件处理程序,例如
myButton.Click += new EventHandler(myButton_Click);
正如您所看到的那样,紧密耦合。您将特定实例耦合在一起。
然而,使用WPF中的命令,有一个很大的区别,因为你不会说this instance handles this
。您正在说I have these methods and properties
(ViewModel)和I need these things to work properly
(查看)。您可以根据需要交换实例,只要它们提供视图正常运行所需的内容即可。但是,您不必关心附加/分离处理程序,手动设置文本值等。这些都是由您自动发生的绑定所关注的。您的视图并不真正了解特定实例。它所知道的是它使用的数据和操作。 ViewModel并不关心这些数据的显示或处理方式。
这就是为什么我实际上不同意Scott Nimrod的回答。这不是紧耦合,而是松耦合(至少在我看来)。当你无法改变一个而不影响另一个并且在MVVM中显然是错误的时候,紧耦合就会出现。实际上,重要的是尽可能地将事物耦合在一起。如果你想看到紧密耦合的组件,请查看winforms。