我有一个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
答案 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
接口)。