如何绑定到树视图的子分支或叶子(以MVVM样式)?

时间:2014-11-11 05:49:45

标签: wpf mvvm treeview selecteditem

我是TreeViews的新手。在WPF风格中,我有一个TreeView,分为三个层次:

ReportName1
     NetworkName1
         PrinterName1
         PrinterName2
     NetworkName2
         PrinterName3
         PrinterName4
ReportName2
    ....

在XAML中,我使用Interaction行为将TreeView SelectedItem绑定到ViewModel:

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

此时,当我选择主报告名称下的任何项目时,一切都适用于从ReportTree发送项目。也就是说,如果我选择PrinterName2,那么SelectedTreeItem将成为ReportName1的主视图模型。

我需要知道的是,如何判断PrinterName2是否被选中而不是PrinterName1?

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

有办法做到这一点吗?

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:1)

这是一个使用TreeView的简单DataTemplate解决此问题的选项,它包含MouseBinding来调用父ViewModel上的select命令,并将点击的项目作为CommandParameter传递

如果您的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;
    }
}

为项目提供简单的ViewModel:

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

    public string Name { get; set; }

    public ItemViewModel()
    {
        Items = new ObservableCollection<ItemViewModel>();
    }
}

然后,您可以将HierarchicalDataTemplate定义为ItemTemplate

的TreeView
<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>

关键部分是从每个项目的MouseBinding绑定到TreeViews DataContext.SelectItemCommand并将该项目作为参数传递。然后,您可以在ViewModel中处理选择本身(设置SelectedItem等)。