WPF HierarchicalDataTemplate TreeView无法点击

5
我有一个使用HierarchicalDataTemplateTreeView。项目已经正确填充,但我无法单击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));
        }
    }
}

很棒,从我所见的一些示例中,使用TreeViewItem的方式就是这样。我已经卡了很长时间了,遇到了同样的问题。 - Andez
2个回答

12

在你的 XAML 中,尝试使用另一个控件,比如 TextBlock,而不是在 HierarchicalDataTemplate 下使用 <TreeViewItem>

<TextBlock Text="{Binding Path=Header}"/>

谢谢。这很有效。在XAML中有没有一种自动展开项目的方法? - user2025830
@user2025830 我会这样做:在你的 ITreeItem 类中创建一个 bool IsExpanded 属性,将初始值设置为 True,并让该类实现 INotifyPropertyChanged。然后在你的 Resources 中有一个针对 TreeViewItemStyle - Mash
@user2025830 这是样式:<Style TargetType="TreeViewItem"> <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> </Style> - Mash

-1

之前的解决方案避免了这个问题。有一种方法可以使用标题选择一个 TreeViewItem:在 MSDN 网站 我们可以找到一个例子,其中使用标题,TreeViewItem 是可点击的。有人知道为什么这里不行吗?

我个人使用了 MouseButtonEventHandler 来“黑客”它,添加了一个 foreach 循环,在具有 isSelected = false; 的项上,然后 ((TreeViewItem)sender).IsSelected = true; 但是很脏。


3
因为OP使用了一个“ItemTemplate”。当使用“ItemTemplate”时,会隐式创建一个<TreeViewItem>。这就解释了即使使用了“TextBlock”,为什么仍然会生成TreeViewItem。在使用模板渲染TreeViewItems时,使用TextBlock是常见的做法。 - Mash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接