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。我被同样的问题困扰了很久。