将文本块插入 treeviewitem

Insert textblock into treeviewitem

我向 treeviewitem 添加了文本块。 但 treeviewitem.header 无法绑定到此文本块。 我应该怎么办?我想在树视图上添加对象。想开发自定义树视图。

<ControlTemplate TargetType="{x:Type TreeViewItem}">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="19" Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}"/>
    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="1" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
        <ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    </Border>
    <ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1"/>
</Grid>

TO

<ControlTemplate TargetType="{x:Type TreeViewItem}">
<Grid Background="#15232e">
    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="19" Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}"/>
    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="Transparent" Grid.Column="1" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
        <TextBlock x:Name="PART_Header" Text="{Binding ??????}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
    </Border>
    <ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1"/>
</Grid>

可能有其他方法可以解决您的问题,但要直接说出您的问题,ContentPresenter 正在获取整个对象。

因此,如果您的视图模型如下所示:

public class Data 
{
   public string Name { get; set; }
   public List<Data> Children { get; set; }
}

然后基本上 ContentPresenterContentSource 属性 基本上是要设置 Content、ContentTemplate 等。 (参见 https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.contentpresenter.contentsource?view=netframework-4.8

在您的树视图分层数据模板中可能如下所示:

<TreeView.ItemTemplate>
   <HierarchicalDataTemplate ItemsSource="{Binding Children}">
      <TextBlock Text="{Binding Name}" />
   </HierarchicalDataTemplate>
</TreeView.ItemTemplate>

内部基本上是提供给演示者的数据模板,而 ItemsSource 将是确定子项的方式。

因此 - 对于您的情况,您要么想要将文本直接绑定到 HierarchicalDataTemplate 中的数据,如上所述,要么如果您确实想要自定义 TreeViewItem 的 ControlTemplate,您可以提供TextBlock 为 PART_Header,但具有对树元素的绑定。鉴于上面的数据 class,它看起来像这样:

<ControlTemplate>
   ...
   <TextBlock x:Name="PART_Header" Text="{Binding Name}"/>
   ...
</ControlTemplate>

让我知道这是否符合您的用例,不幸的是,如果没有更多信息很难说。祝你好运!