我有一个WPF MultiSelectTreeView(从这里下载:http://unclassified.software/en/source/multiselecttreeview)。
现在我想控制用户选择哪些项目。一个简单的例子是,他不应该选择不同父节点的子节点。但也有更多特定于ViewModel的用例。
通过使用PreviewSelectionChanged事件,直接检查条件并相应地设置Cancel标志,在Window的代码隐藏中很容易实现这一点。但由于我想获得View和ViewModel的分离,我正在寻找一种在WindowViewModel中实现这一点的方法。
当然,您也可以将检查提取到ViewModel并从视图中调用它,但它看起来是错误的:
WindowViewModel _viewModel;
void PreviewSelectionChanged(object sender, PreviewSelectionChangedEventArgs e)
{
e.Cancel = !this._viewModel.CanSelect(e.Item as TreeItemViewModel);
}
我希望每个人都有一个主意。
-timnot90
通常,当数据将分层集合绑定到WPF中的TreeView
时,自定义数据项应在其类中定义IsSelected
属性。如果他们这样做了,那么它可以被数据绑定到每个TreeViewItem
:的IsSelected
属性
<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
属性何时更改(如果它们按预期实现了INotifyPropertyChanged
接口)。