WPF:绑定与自身相同的样式
WPF: Binding the same style from itself
如何从自身(从 FolderStyle)调用样式(FolderStyle)?
基本上我有一个代表对象树的 TreeView。在树中有文件夹和不同的对象。每个文件夹可以包含每种类型的对象以及其他文件夹。每个对象类型和文件夹都有自己的样式(因为您必须显示对象不同的参数和其他内容)。
我所做的是将 TreeView ItemContainerStyle 绑定到 FolderStyle
<TreeView ItemsSource="{Binding RootNodes}" ItemContainerStyle="{StaticResource FolderStyle}"/>
然后在文件夹样式中,我检查文件夹的子项并决定每个单独的子项应通过触发器获得哪种样式
<Style x:Key="FolderStyle" TargetType="TreeViewItem">
<Style.Triggers>
<DataTrigger Binding="{Binding ObjectType}" Value="1">
<Setter Property="Header">
<Setter.Value>
<StackPanel Orientation="Horizontal">
<Image Margin="0,0,3,0" Width="16" Source="{Binding Mode=OneWay, Source={StaticResource Folder}}"/>
<TextBlock>Folder</TextBlock>
</StackPanel>
</Setter.Value>
</Setter>
<Setter Property="ItemsSource" Value="{Binding Children}"/>
<Setter Property="ItemContainerStyle" Value="{Binding RelativeSource={RelativeSource AncestorType=TreeView},Path=ItemContainerStyle}"/> //Problem is in this line. This exact way of doing it will give you an exception that says that the object already has a logical parent and you have to unbind it
</DataTrigger>
<DataTrigger Binding="{Binding ObjectType}" Value="2">
<Setter Property="Template" Value="{StaticResource ObjectATemplate}"/>
</DataTrigger>
<DataTrigger Binding="{Binding ObjectType}" Value="3">
<Setter Property="Template" Value="{StaticResource ObjectBTemplate}"/>
...And so on
</Style.Triggers>
</Style>
我需要子文件夹样式与根文件夹样式完全相同,因为树可以是无限的(您可以使用文件夹和对象创建任何级别的层次结构)。除了子文件夹之外,所有样式都有效 one.I 已尝试将文件夹 ItemContainerStyle 绑定到 FolderStyle 但无法解析。呈现的方式运行但不应用样式(它在树中显示对象类型)。
如何将文件夹样式应用于子文件夹?
我认为问题不在于应用样式,而在于 Header
属性,它试图为所有 Headers 分配相同的 StackPanel
,因此例外。解决方法是使用 HeaderTemplate
:
<DataTrigger Binding="{Binding ObjectType}" Value="1">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Margin="0,0,3,0" Width="16" Source="{Binding Mode=OneWay, Source={StaticResource Folder}}"/>
<TextBlock>Folder</TextBlock>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
...
我还建议使用 HierarchicalDataTemplate
来解决这 class 个问题。
如何从自身(从 FolderStyle)调用样式(FolderStyle)?
基本上我有一个代表对象树的 TreeView。在树中有文件夹和不同的对象。每个文件夹可以包含每种类型的对象以及其他文件夹。每个对象类型和文件夹都有自己的样式(因为您必须显示对象不同的参数和其他内容)。 我所做的是将 TreeView ItemContainerStyle 绑定到 FolderStyle
<TreeView ItemsSource="{Binding RootNodes}" ItemContainerStyle="{StaticResource FolderStyle}"/>
然后在文件夹样式中,我检查文件夹的子项并决定每个单独的子项应通过触发器获得哪种样式
<Style x:Key="FolderStyle" TargetType="TreeViewItem">
<Style.Triggers>
<DataTrigger Binding="{Binding ObjectType}" Value="1">
<Setter Property="Header">
<Setter.Value>
<StackPanel Orientation="Horizontal">
<Image Margin="0,0,3,0" Width="16" Source="{Binding Mode=OneWay, Source={StaticResource Folder}}"/>
<TextBlock>Folder</TextBlock>
</StackPanel>
</Setter.Value>
</Setter>
<Setter Property="ItemsSource" Value="{Binding Children}"/>
<Setter Property="ItemContainerStyle" Value="{Binding RelativeSource={RelativeSource AncestorType=TreeView},Path=ItemContainerStyle}"/> //Problem is in this line. This exact way of doing it will give you an exception that says that the object already has a logical parent and you have to unbind it
</DataTrigger>
<DataTrigger Binding="{Binding ObjectType}" Value="2">
<Setter Property="Template" Value="{StaticResource ObjectATemplate}"/>
</DataTrigger>
<DataTrigger Binding="{Binding ObjectType}" Value="3">
<Setter Property="Template" Value="{StaticResource ObjectBTemplate}"/>
...And so on
</Style.Triggers>
</Style>
我需要子文件夹样式与根文件夹样式完全相同,因为树可以是无限的(您可以使用文件夹和对象创建任何级别的层次结构)。除了子文件夹之外,所有样式都有效 one.I 已尝试将文件夹 ItemContainerStyle 绑定到 FolderStyle 但无法解析。呈现的方式运行但不应用样式(它在树中显示对象类型)。
如何将文件夹样式应用于子文件夹?
我认为问题不在于应用样式,而在于 Header
属性,它试图为所有 Headers 分配相同的 StackPanel
,因此例外。解决方法是使用 HeaderTemplate
:
<DataTrigger Binding="{Binding ObjectType}" Value="1">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Margin="0,0,3,0" Width="16" Source="{Binding Mode=OneWay, Source={StaticResource Folder}}"/>
<TextBlock>Folder</TextBlock>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
...
我还建议使用 HierarchicalDataTemplate
来解决这 class 个问题。