C# 树状视图控件中的标题文本移位

C# 树状视图控件中的标题文本移位,c#,.net,wpf,treeview,C#,.net,Wpf,Treeview,我正在玩WPF TreeView控件,面临着奇怪的问题。 当我以编程方式添加TreeView项时,所有工作正常,但如果我通过绑定添加了项,则标题中的项会有间隙: 此外,这个缺口只是TreeItem线路的一个“敏感”部分。我无法通过单击文本来选择项目,只有单击间隙区域才能选择该项目。 这是我的密码: namespace WPFTreeViewExperience { /// <summary> /// Data item interface /// </

我正在玩WPF TreeView控件,面临着奇怪的问题。 当我以编程方式添加TreeView项时,所有工作正常,但如果我通过绑定添加了项,则标题中的项会有间隙:

此外,这个缺口只是TreeItem线路的一个“敏感”部分。我无法通过单击文本来选择项目,只有单击间隙区域才能选择该项目。 这是我的密码:

namespace WPFTreeViewExperience
{
    /// <summary>
    /// Data item interface
    /// </summary>
    public interface IMyTree
    {
        string Title { get; set; }
        List<IMyTree> Items { get; set; }
    }

    /// <summary>
    /// Hierarchical data model
    /// </summary>
    public class MyTreeLevel : IMyTree
    {
        public string Title { get; set; }

        public List<IMyTree> Items { get; set; }

        public MyTreeLevel(string Title, params MyTreeLevel[] Items)
        {
            this.Title = Title;

            this.Items = new List<IMyTree>();

            foreach (MyTreeLevel item in Items)
            {
                this.Items.Add(item);
            }
        }
    }

    /// <summary>
    /// Viewmodel
    /// </summary>
    public class MyTreeViewModel : INotifyPropertyChanged
    {

        private void NotifyChanges(string PropName)
        {
            if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(PropName));
        }
    }

    private List<MyTreeLevel> _Tree;

    public List<MyTreeLevel> MyTree
    {
        get
        {
            return _Tree;
        }

        set
        {
            _Tree = value;
            NotifyChanges("MyTree");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public MyTreeViewModel()
    {
        List<MyTreeLevel> simpleTree = new List<MyTreeLevel>();

            simpleTree.Add(new MyTreeLevel("1-0", new MyTreeLevel("1-1"),
                                          new MyTreeLevel("1-2",
                                                                new MyTreeLevel("1-2-1"),
                                                                new MyTreeLevel("1-2-2")
                                                                ),
                                          new MyTreeLevel("1-3")));

            simpleTree.Add(new MyTreeLevel("2-0", new MyTreeLevel("2-1"),
                                          new MyTreeLevel("2-2",
                                                                new MyTreeLevel("2-2-1"),
                                                                new MyTreeLevel("2-2-2"),
                                          new MyTreeLevel("2-3"))));

            MyTree = simpleTree;
        }
    }

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
        public partial class MainWindow : Window
        {        
            public MainWindow()
            {
                InitializeComponent();

                TreeExample.DataContext = new MyTreeViewModel();
            }
        }
    }
命名空间WPFTreeViewExperience
{
/// 
///数据项接口
/// 
公共接口IMyTree
{
字符串标题{get;set;}
列表项{get;set;}
}
/// 
///分层数据模型
/// 
公共类MyTreeLevel:IMyTree
{
公共字符串标题{get;set;}
公共列表项{get;set;}
公共MyTreeLevel(字符串标题,参数MyTreeLevel[]项)
{
这个.Title=Title;
this.Items=新列表();
foreach(项目中的MyTreeLevel项目)
{
此.Items.Add(item);
}
}
}
/// 
///视图模型
/// 
公共类MyTreeView模型:INotifyPropertyChanged
{
私有void NotifyChanges(字符串PropName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新PropertyChangedEventArgs(PropName));
}
}
私有列表树;
公共列表MyTree
{
得到
{
返回树;
}
设置
{
_树=价值;
通知变更(“MyTree”);
}
}
公共事件属性更改事件处理程序属性更改;
公共MyTreeView模型()
{
List simpleTree=新列表();
simpleTree.Add(新MyTreeLevel(“1-0”),新MyTreeLevel(“1-1”),
新MyTreeLevel(“1-2”,
新MyTreeLevel(“1-2-1”),
新MyTreeLevel(“1-2-2”)
),
新MyTreeLevel(“1-3”);
simpleTree.Add(新MyTreeLevel(“2-0”),新MyTreeLevel(“2-1”),
新MyTreeLevel(“2-2”,
新MyTreeLevel(“2-2-1”),
新MyTreeLevel(“2-2-2”),
新MyTreeLevel(“2-3”);
MyTree=simpleTree;
}
}
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{        
公共主窗口()
{
初始化组件();
treeeexample.DataContext=new MyTreeViewModel();
}
}
}
以及我的XAML代码:

<Window x:Class="WPFTreeViewExperience.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPFTreeViewExperience"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView Name="TreeExample" ItemsSource="{Binding MyTree}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Items}" DataType="{x:Type local:MyTreeLevel}">
                    <TreeViewItem Header="{Binding Title}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>        
    </Grid>
</Window>


我的绑定有什么问题?

我认为ItemTemplate应该是这样的:

  <HierarchicalDataTemplate ItemsSource="{Binding Items}" DataType="{x:Type local:MyTreeLevel}">
        <Grid>
            <TextBlock Margin="0" Text="{Binding Path=Title}" />
        </Grid>
    </HierarchicalDataTemplate>


它正在工作!但是它也可以在没有网格的情况下工作。你能给我解释一下你计划实现的网格标签的技巧吗?是的,它在没有网格的情况下工作。如果我想添加其他内容,我将使用网格。例如,图标