将多个树视图的属性绑定到同一ViewModel

时间:2011-09-20 03:02:30

标签: c# wpf mvvm

我正在开发一个MVVM实现,我将生成多个视图(并排),每个视图都包含一个树控件。

每个视图都有一个类似的树,带有[几乎]所有相同项目的副本。

我想在所有视图/ TreeView上同步IsExpanded属性..

意思是,如果我折叠一个节点,我希望它们全部崩溃(有些用于列宽等)。

执行此操作的一种方法是将所有视图绑定到同一个viewmodel,并在该ViewModel上具有DependencyProperty,并在每个视图上将绑定设置为Two Way。但是,我需要将每个视图绑定到单独的视图模型,以便它可以显示唯一值。我只需要同步树的一些属性,例如IsExpanded和Width。

这里最好的方法是什么?

4 个答案:

答案 0 :(得分:1)

如果这是最佳设计选项,那么您无法在单个ViewModel中拥有不同的集合。特别是如果你的多个树/集合被从一些'完整集'中过滤掉;它实际上可能更有意义。

只需将多个集合添加到ViewModel,然后绑定到它们即可。

public class MyViewModel : INotifyPropertyChanged
{
    public ObservableCollection<MyItem> FirstTreeCollection 
    { 
        get
        {
            // whatever you need to do here
        }
    }

    public ObservableCollection<MyItem> SecondTreeCollection 
    { 
        get { /* etc */ }
        set { /* etc */ }
    }
    // etc

    public bool Collapsed
    {
        get;
        set;
    }
}

并且您的视图应该相应地绑定

// in your first view that contains a tree
<UserControl x:Class="View1" ...>
    <TreeView Name="FirstTree" 
              ItemsSource={Binding FirstTreeCollection}
              Collapsed={Binding Collapsed} ... >

// & in your second view that contains a tree
<UserControl x:Class="View2" ...>
    <TreeView Name="SecondTree" 
              ItemsSource={Binding SecondTreeCollection}
              Collapsed={Binding Collapsed} ... >

为了澄清,我建议您对所有这些包含树的视图使用单个ViewModel

答案 1 :(得分:1)

您可以使用PrismEventAggregator服务在视图模型之间交换数据。

答案 2 :(得分:0)

ViewModel不需要DependencyPropery - 它只需要公开一个实现INotifyPropertyChanged的属性。

两个ViewModel需要有一些共享状态的方法,并暴露表示该状态的属性。如何共享状态在很大程度上取决于ViewModel的实例化方式(可能还有其他因素)。例如,如果您的两个VM由某个父对象实例化,则父级可以创建一个实例并将其传递给其构造函数中的两个VM。

答案 3 :(得分:0)

如果使用xaml显示树视图,则可以将每个树视图绑定到生成的第一个树视图。

例如,你可以使用这样的绑定:

<TreeView Name="FirstTreeView" />
<TreeView Name="SecondTree" 
          IsExpended = {Binding Path=IsExpanded, ElementName=FirstTreeView, Mode=TwoWay}/>