如何从MultiSelectTreeView的ViewModel控制选择



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

最新更新