View-Models中的命令

时间:2012-02-12 12:30:30

标签: wpf mvvm

我正在开发我的第一个WPF / MVVM应用程序,并且我遇到了对命令知识的限制!

这是我的情景。

我有一个窗口 - Customer.xaml。

它包含2个用户控件

  • viewCustomerSearch.xaml
  • viewCustomerDetails.xaml

每个人都拥有自己的视图模型。

因此,层次结构如下所示:

... Customer.xaml

...... ... viewCustomerSearch.xaml

... ... ... viewmodelCustomerSearch.xaml

...... ... viewCustomerDetails.xaml

... ... ... viewmodelCustomerDetails.xaml

我理解这是一种“并不罕见”的情况。

对于它的价值,用户通过双击viewCustomerSearch.xaml控件中的listview行来选择客户。

问题是:我现在需要告诉viewmodelCustomerDetails.xaml类用户刚刚选择了哪个客户。我根本无法解决这个问题。

有没有人在我声明我需要的命令,它如何连接,实现代码触发的位置等方面有任何帮助?

感谢任何帮助, DS

2 个答案:

答案 0 :(得分:4)

通常,要进行视图间模型通信,您可以:

  1. 使用标准.NET事件,并使用父视图模型作为中介 - 在您的情况下,Customer视图模型将引用2个子视图模型,并可以订阅事件,并在子视图上调用适当的方法事件发布时的模型
  2. 使用事件聚合器模式
  3. Caliburn.MicroPrism等框架提供了事件聚合器模式的实现。

答案 1 :(得分:0)

或者,如果您不需要完全分离的视图模型,那么您的Customers.xaml可以将其DataContext设置为CustomersViewModel的实例。搜索视图将继承此数据上下文,将其列表视图绑定到客户列表,并设置SelectedItem属性以响应双击。详细视图DataContext将绑定到SelectedItem属性。

public class CustomersViewModel : ViewModelBase
{
    public Customer SelectedItem
    {
        get { return _selectedItem; }
        set { Set(() => SelectedItem, ref _selectedItem, value); }
    }

    private Customer _selectedItem;
    public IEnumerable<Customer> Customers { get; private set; }
}

public class Customer : ViewModelBase
{
    private string _name;

    public string Name
    {
        get { return _name; }
        set { Set(() => Name, ref _name, value); }
    }
    ...
}