C# 如何控制从MultiSelectTreeView的ViewModel中选择

C# 如何控制从MultiSelectTreeView的ViewModel中选择,c#,wpf,mvvm,viewmodel,view-model-pattern,C#,Wpf,Mvvm,Viewmodel,View Model Pattern,我有一个WPF MultiSelectTreeView(从这里下载:) 现在我想控制用户选择的项目。一个简单的例子是,他不应该能够选择不同父节点的子节点。但也有更多特定于ViewModel的用例 通过使用PreviewSelectionChanged事件,直接检查条件并相应地设置Cancel标志,在窗口的代码隐藏中很容易实现这一点。但是,由于我想获得视图和ViewModel的分离,我正在寻找一种在WindowViewModel中实现这一点的方法 当然,您也可以将检查提取到ViewModel并从视

我有一个WPF MultiSelectTreeView(从这里下载:)

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

通过使用PreviewSelectionChanged事件,直接检查条件并相应地设置Cancel标志,在窗口的代码隐藏中很容易实现这一点。但是,由于我想获得视图和ViewModel的分离,我正在寻找一种在WindowViewModel中实现这一点的方法

当然,您也可以将检查提取到ViewModel并从视图中调用它,但它看起来是错误的:

WindowViewModel _viewModel;

void PreviewSelectionChanged(object sender, PreviewSelectionChangedEventArgs e)
{
     e.Cancel = !this._viewModel.CanSelect(e.Item as TreeItemViewModel);
}
我希望任何人都有想法


-timnot90

通常,当数据在WPF中将分层集合绑定到
树视图
时,自定义数据项应在其类中定义
IsSelected
属性。如果是,则可以将其数据绑定到每个
treevieItem
IsSelected
属性:

<TreeView ItemsSource="{Binding YourCollection}" ... >
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

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

视图/逻辑的分离并不意味着视图类中没有代码。使用PreviewSelectionChanged不会丢失ViewModels的可测试性,因此在我看来这很好。通常,您的数据项应该有一个
IsSelected
属性,您可以将该属性数据绑定到
TreeViewItem.IsSelected
属性。然后您可以将其设置为
true
以选择一个项目,将其设置为
false
以取消选择一个项目。@Sheridan是的。但是我不知道什么时候设置这个属性。如果我使用代码隐藏,我也可以按照我在问题中描述的方式来做。既然看起来没事,我想我会的。我只是觉得在mvvm中有一种奇特的、非凡的方法可以做到这一点。谢谢你的帮助。还有一件事:在没有“真实”答案的情况下,我怎么做才能将这个问题标记为已回答?我现在在数据项的ViewModel中实现了一个IsSelectedChanged事件,它工作得很好。谢谢。
// Select Item
dataObject.IsSelected = true;

// Deselect Item
dataObject.IsSelected = false;