Wpf 如何绑定到treeview的子分支或叶(MVVM样式)?

Wpf 如何绑定到treeview的子分支或叶(MVVM样式)?,wpf,mvvm,treeview,selecteditem,Wpf,Mvvm,Treeview,Selecteditem,我是TreeViews的新手。在WPF风格中,我将树状视图分为三个级别: ReportName1 NetworkName1 PrinterName1 PrinterName2 NetworkName2 PrinterName3 PrinterName4 ReportName2 .... 在XAML中,我使用交互行为将TreeView SelectedItem绑定到ViewModel: <

我是TreeViews的新手。在WPF风格中,我将树状视图分为三个级别:

ReportName1
     NetworkName1
         PrinterName1
         PrinterName2
     NetworkName2
         PrinterName3
         PrinterName4
ReportName2
    ....
在XAML中,我使用交互行为将TreeView SelectedItem绑定到ViewModel:

  <TreeView ItemsSource="{Binding ReportTree}"  >
            <i:Interaction.Behaviors>
                <tvb:TreeViewBehavior SelectedItem="{Binding SelectedTreeItem, Mode=TwoWay}" />
            </i:Interaction.Behaviors>

此时,当我选择主报告名称下的任何项目时,所有这些都可以很好地从ReportTree发送一个项目。也就是说,如果选择PrinterName 2,则SelectedTreeItem将成为ReportName1的主视图模型

我需要知道的是,我如何判断选择了PrinterName2而不是PrinterName1

我的最终目标是允许选择树中的任何叶或枝,并仅删除选定的叶或枝

有办法做到这一点吗


感谢您在这方面的帮助。

这里有一个选项可以解决这个问题,它使用一个简单的
数据模板
,用于树视图,其中包含一个
鼠标绑定
,以调用父视图模型上的select命令,并将单击的项作为
命令参数
传递

如果您的ViewModel看起来像这样:

public class MainViewModel
{
    public ObservableCollection<ItemViewModel> Items { get; private set; }

    public ItemViewModel SelectedItem { get; set; }

    public ICommand SelectItem { get; private set; }

    public MainViewModel()
    {
        SelectItem = new LazyCommand<ItemViewModel>(ExecuteSelect);
        Items = new ObservableCollection<ItemViewModel>();            
    }

    private void ExecuteSelect(ItemViewModel item)
    {
        SelectedItem = item;
    }
}

关键部分是绑定到TreeViews DataContext.SelectItem命令,该命令来自每个项的鼠标绑定,并将该项作为参数传入。然后,您可以在ViewModel中处理选择本身(设置
SelectedItem
等)。

我对定义这个有点迷茫:SelectItem=new LazyCommand(ExecuteSelect);谢谢。你好,Alan,LazyCommand是ICommand接口的通用实现,在每个MVVM框架中都可以找到它。有时它的名称不同,例如RelayCommand。您熟悉ICommand接口和一些MVVM框架吗?如果不是的话,这可能会对你有所帮助。非常感谢。但有一件事(小问题)是,将TextBlock.InputBindings绑定到SelectedTreeItem似乎会破坏TreeView SelectedItem绑定到SelectedTreeItem之前的工作代码。从未设置SelectedTreeItem属性。想法?嗯,不是马上,不是。但这不是多余的吗?可能吧。只是好奇。谢谢
public class ItemViewModel
{
    public ObservableCollection<ItemViewModel> Items { get; private set; }

    public string Name { get; set; }

    public ItemViewModel()
    {
        Items = new ObservableCollection<ItemViewModel>();
    }
}
<TreeView ItemsSource="{Binding Items}">
        <TreeView.ItemTemplate>

            <HierarchicalDataTemplate ItemsSource="{Binding Items}" >
                <TextBlock Text="{Binding Name}">
                    <TextBlock.InputBindings>
                        <MouseBinding MouseAction="LeftClick"
                                    Command="{Binding DataContext.SelectItem, RelativeSource={RelativeSource FindAncestor, AncestorType=TreeView}}"
                                    CommandParameter="{Binding}" />
                    </TextBlock.InputBindings>
                </TextBlock>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>