WPF HierarchycalDataTemplate树视图不可单击
我有一个WPF HierarchycalDataTemplate树视图不可单击,wpf,xaml,treeview,hierarchicaldatatemplate,Wpf,Xaml,Treeview,Hierarchicaldatatemplate,我有一个TreeView和一个hierarchycaldatatemplate。项目填写正确,但我无法单击TreeView项目。(我无法选择一个,因此它被标记为蓝色)。 我可以单击TreeViewItem前面的,然后选中的标记为蓝色。看起来好像有一个小盒子,我可以点击,但不是其余的 这是我的密码: XAML: <TreeView ItemsSource="{Binding Main.TreeItems}"> <TreeView.ItemTemplate>
TreeView
和一个hierarchycaldatatemplate
。项目填写正确,但我无法单击TreeView
项目。(我无法选择一个,因此它被标记为蓝色)。
我可以单击TreeViewItem
前面的,然后选中的标记为蓝色。看起来好像有一个小盒子,我可以点击,但不是其余的
这是我的密码:
XAML:
<TreeView ItemsSource="{Binding Main.TreeItems}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
<TreeViewItem Header="{Binding Path=Header}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
型号
public class ITreeItem
{
public string Header { get; set; }
public List<ITreeItem> Children { get; set; }
}
class MainModel : INotifyPropertyChanged
{
private List<ITreeItem> _treeitems;
public MainModel()
{
_treeitems = new List<ITreeItem>();
List<ITreeItem> treeList = new List<ITreeItem>();
ITreeItem myItem1 = new ITreeItem();
myItem1.Header = "Test1";
myItem1.Children = new List<ITreeItem>();
treeList.Add(myItem1);
myItem1.Header = "Test2";
myItem1.Children = new List<ITreeItem>();
treeList.Add(myItem1);
TreeItems = treeList;
}
public List<ITreeItem> TreeItems
{
get
{
return _treeitems;
}
set
{
_treeitems = value;
OnPropertyChanged("TreeItems");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
公共类ITreeItem
{
公共字符串头{get;set;}
公共列表子项{get;set;}
}
类MainModel:INotifyPropertyChanged
{
私有列表树;
公共模型()
{
_treeitems=新列表();
列表树列表=新列表();
ITreeItem myItem1=新的ITreeItem();
myItem1.Header=“Test1”;
myItem1.Children=新列表();
添加树列表(myItem1);
myItem1.Header=“Test2”;
myItem1.Children=新列表();
添加树列表(myItem1);
TreeItems=树列表;
}
公共列表树
{
得到
{
返回树项;
}
设置
{
_treeitems=值;
不动产变更(“树木”);
}
}
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串propertyName)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
在XAML中,尝试使用另一个控件,例如文本块,而不是在层次数据模板下使用
:
<TextBlock Text="{Binding Path=Header}"/>
前面的解决方案避免了该问题。有一种方法可以使用标题选择treevieItem
:在使用标题的MSDN网站上,可以单击treevieItem
。有人知道为什么这里不可能吗
我个人使用MouseButtonEventHandler
在isSelected=false的项目上添加foreach
进行黑客攻击
然后((TreeViewItem)sender)。IsSelected=true代码>但那太脏了。谢谢。这很有效。有没有办法在xaml中自动展开项?@user2025830我的方法是在ITreeItem
类中创建bool IsExpanded
属性,将初始值设置为True
,并让该类实现INotifyPropertyChanged
。然后,在您的资源中
有一个样式
,它针对TreeViewItem
@user2025830,这里有一个样式:这是因为OP使用的是ItemTemplate
。使用ItemTemplate时,将隐式创建一个。这解释了为什么即使使用了TextBlock
,仍然会生成树视图项。使用TextBlock来呈现使用模板的TreeViewItem是一种常见的做法。令人惊讶的是,根据我所看到的,一些示例以这种方式使用TreeViewItem。我被同样的问题困扰了很久。