如何从MultiSelectTreeView的ViewModel控制选择

时间:2015-02-23 08:40:31

标签: c# wpf mvvm viewmodel view-model-pattern

我有一个WPF MultiSelectTreeView(从这里下载:http://unclassified.software/en/source/multiselecttreeview)。

现在我想控制用户选择的项目。一个简单的例子是他不应该能够选择不同父母的子节点。但是还有更多特定于ViewModel的用例。

通过使用PreviewSelectionChanged事件,直接检查条件并相应地设置Cancel-flag,可以很容易地在Window的代码隐藏中实现这一点。但是因为我想获得View和ViewModel的分离,我正在寻找一种在WindowViewModel中执行此操作的方法。

当然你也可以将检查提取到ViewModel并从视图中调用它,但它看起来不对:

WindowViewModel _viewModel;

void PreviewSelectionChanged(object sender, PreviewSelectionChangedEventArgs e)
{
     e.Cancel = !this._viewModel.CanSelect(e.Item as TreeItemViewModel);
}

我希望有人有个主意。

- timnot90

1 个答案:

答案 0 :(得分:0)

通常,当数据将层次结构集合绑定到WPF中的TreeView时,自定义数据项应在其类中定义IsSelected属性。如果他们这样做,那么它可以是绑定到每个IsSelected的{​​{1}}属性的数据:

TreeViewItem

完成此操作后,您只需将该属性设置为<TreeView ItemsSource="{Binding YourCollection}" ... > <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsSelected" Value="{Binding IsSelected}" /> </Style> </TreeView.ItemContainerStyle> </TreeView> 即可选择项目,并true取消选择项目。

false

您可以为每个项目的// Select Item dataObject.IsSelected = true; // Deselect Item dataObject.IsSelected = false; 事件添加处理程序,以检测PropertyChanged属性何时更改(如果它们按预期实现IsSelected接口)。