如何从 MultiSelectTreeView 的 ViewModel 控制选择

How to control selection from ViewModel of MultiSelectTreeView

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

现在我想控制用户 select 的哪些项目。一个简单的例子就是他不应该select不同父节点的子节点。但也有更多特定于 ViewModel 的用例。

通过使用 PreviewSelectionChanged 事件,在 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 时,自定义数据项应在其 class 中定义 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 到 select 一个项目,然后将 false 设置为 deselect 一个项目.

// Select Item
dataObject.IsSelected = true;

// Deselect Item
dataObject.IsSelected = false;

您可以向每个项目的 PropertyChanged 事件添加处理程序以检测 IsSelected 属性 何时更改(如果它们按预期实现了 INotifyPropertyChanged 接口) .