我是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?
我的最终目标是允许选择树中的任何叶子或分支,并仅删除选定的叶子或分支。
有办法做到这一点吗?
感谢您提供任何帮助。
答案 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 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
等)。