Wpf 如何绑定到treeview的子分支或叶(MVVM样式)?
我是TreeViews的新手。在WPF风格中,我将树状视图分为三个级别: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: <
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>