为什么命令来自ViewModel类?

时间:2015-02-25 17:53:17

标签: wpf mvvm

我刚看完“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中定义。

2 个答案:

答案 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。