WPF HierarchicalDataTemplate TreeView不可点击

时间:2013-02-14 14:44:53

标签: wpf xaml treeview hierarchicaldatatemplate

我有TreeView HierarchicalDataTemplate。这些项目已正确填写,但我无法点击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));
        }
    }
}

2 个答案:

答案 0 :(得分:10)

在您的XAML中,不要使用<TreeViewItem>下的HierarchicalDataTemplate,而是尝试使用其他控件,例如TextBlock

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

答案 1 :(得分:-1)

之前的解决方案避免了这个问题。有一种方法可以使用标头在MSDN网站we can find an example上选择TreeViewItem:使用标头,其中TreeViewItem可以点击。有人知道为什么在这里不可能吗?

我个人使用MouseButtonEventHandlerforeach然后isSelected = false;的项目上添加((TreeViewItem)sender).IsSelected = true;,但这很脏。