将文本块插入 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; }
}
然后基本上 ContentPresenter
的 ContentSource
属性 基本上是要设置 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>
让我知道这是否符合您的用例,不幸的是,如果没有更多信息很难说。祝你好运!
我向 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; }
}
然后基本上 ContentPresenter
的 ContentSource
属性 基本上是要设置 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>
让我知道这是否符合您的用例,不幸的是,如果没有更多信息很难说。祝你好运!