【发布时间】:2016-10-05 16:58:01
【问题描述】:
我有一个简单的TreeView,我正在尝试为它创建一个自定义DataTemplate。它按需要显示,但是当我尝试选择TreeViewItem 时,如果单击TreeView 中的文本,突出显示将不起作用。但是,如果我只选择文本的左侧,它会起作用:
来源非常简单,所以我猜我只是缺少样式连接:
xaml
<TreeView x:Name="treeView"
ItemsSource="{Binding TreeViewItems}"
Grid.Row="0">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=MenuItems}">
<TreeViewItem Header="{Binding Header}">
<TreeViewItem.InputBindings>
<MouseBinding MouseAction="LeftClick"
Command="{Binding Command}" />
</TreeViewItem.InputBindings>
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
我尝试将此添加到 xaml,但没有帮助:
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}"
BasedOn="{StaticResource {x:Type TreeViewItem}}" />
</TreeView.ItemContainerStyle>
树视图模型
public class TreeViewModel : BaseNotifyModel, ITreeViewModel
{
public TreeViewModel(ITreeViewService menuService)
{
TreeViewItems =
new ReadOnlyObservableCollection<MenuItemViewModel>(menuService.TreeViewMenu);
}
public ReadOnlyObservableCollection<MenuItemViewModel> TreeViewItems
{
get
{
return Get<ReadOnlyObservableCollection<MenuItemViewModel>>();
}
private set
{
Set(value);
}
}
}
MenuItemViewModel
public class MenuItemViewModel : BaseNotifyModel
{
public MenuItemViewModel()
{
MenuItems =
new ObservableCollection<MenuItemViewModel>();
}
public String Header
{
get
{
return Get<String>();
}
set
{
Set(value);
}
}
public ICommand Command
{
get
{
return Get<ICommand>();
}
set
{
Set(value);
}
}
public ObservableCollection<MenuItemViewModel> MenuItems
{
get
{
return Get<ObservableCollection<MenuItemViewModel>>();
}
set
{
Set(value);
}
}
}
【问题讨论】:
-
为什么要将 TreeViewItem 放入 TreeViewItem 的数据模板中?为什么要两个嵌套的树视图项?
-
只需将常规 TextBlock 放入模板中,而不是另一个 TreeViewItem。
-
我会在 ItemContainerStyle 中进行输入绑定,并将 Header 绑定到样式中的 MenuItemViewModel.Header,然后在数据模板中扔一个
<ContentControl Content="{Binding Header}" />。或者只使用 Evk 所说的 TextBlock 或 Label。 -
感谢您的反对,似乎有道理
-
@EdPlunkett - 我想为其添加自定义命令操作
标签: c# wpf xaml treeview highlight