我正在开发一个MVVM实现,我将生成多个视图(并排),每个视图都包含一个树控件。
每个视图都有一个类似的树,带有[几乎]所有相同项目的副本。
我想在所有视图/ TreeView上同步IsExpanded属性..
意思是,如果我折叠一个节点,我希望它们全部崩溃(有些用于列宽等)。
执行此操作的一种方法是将所有视图绑定到同一个viewmodel,并在该ViewModel上具有DependencyProperty,并在每个视图上将绑定设置为Two Way。但是,我需要将每个视图绑定到单独的视图模型,以便它可以显示唯一值。我只需要同步树的一些属性,例如IsExpanded和Width。
这里最好的方法是什么?
答案 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)
您可以使用Prism和EventAggregator服务在视图模型之间交换数据。
答案 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}/>