祖先绑定在 ListView 中只工作一次
Ancestor binding works only once in ListView
我的Window.Resources中有一个风格:
<Style x:Key="Header" TargetType="GridViewColumnHeader">
<Setter Property="Content">
<Setter.Value>
<StackPanel Orientation="Horizontal">
<Label Width="80" HorizontalContentAlignment="Center" Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=GridViewColumnHeader, AncestorLevel=1}, Path=Tag}" />
<StackPanel Orientation="Vertical">
<Polygon Name="P_up" Points="0,5 10,5, 5,0" Stroke="Black" Fill="Black" Margin="3" Visibility="Visible"/>
<Polygon Name="P_down" Points="0,0 10,0, 5,5" Stroke="Black" Fill="Black" Margin="3" Visibility="Hidden"/>
</StackPanel>
</StackPanel>
</Setter.Value>
</Setter>
<EventSetter Event="Click" Handler="Header_Click"/>
</Style>
当我将此样式设置为我的 ListView (GridViewColumnHeader) 时,如下所示:
<ListView Height="300" x:Name="lv" ItemsSource="{Binding PLCs}">
<ListView.View>
<GridView>
<GridViewColumn Width="120">
<GridViewColumnHeader Name="myNewText" Tag="test" Style="{StaticResource Header}"/>
</GridViewColumn>
<GridViewColumn Width="120">
<GridViewColumnHeader Name="myNewText2" Tag="test2" Style="{StaticResource Header}"/>
</GridViewColumn>
<GridViewColumn Width="120">
<GridViewColumnHeader Tag="test32" Style="{StaticResource Header}"/>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
绑定到祖先 Tag 有效并显示 Polygon,但仅显示 [=20] 的最后一个=]GridViewColumns,前两个留空。谁能告诉我我做错了什么?由于所有三列的代码都相同,我认为它会为所有三列提供相同的结果。我想要么是 Content 绑定 Label 要么是 TargetType 绑定 Style 不正确。
感谢您的帮助。
你应该使用 ContentTemplate
属性:
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<! -- ...place your stack panel here -->
</DataTemplate>
</Setter.Value>
</Setter>
这样,您就为每一列 header 定义了一个 模板 。该模板将独立实例化每一列的内容 header。
如果您使用 Content
属性,您可以将相同的堆栈面板设置为所有列 header 的内容。这行不通 - 只有最后一个会赢。堆栈面板的 parent 将自动设置为最后一个 header。就像:
header1.Content = your_stack_panel;
your_stack_panel.Parent = header1;
header2.Content = your_stack_panel;
your_stack_panel.Parent = header2;
header3.Content = your_stack_panel;
your_stack_panel.Parent = header3;
我的Window.Resources中有一个风格:
<Style x:Key="Header" TargetType="GridViewColumnHeader">
<Setter Property="Content">
<Setter.Value>
<StackPanel Orientation="Horizontal">
<Label Width="80" HorizontalContentAlignment="Center" Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=GridViewColumnHeader, AncestorLevel=1}, Path=Tag}" />
<StackPanel Orientation="Vertical">
<Polygon Name="P_up" Points="0,5 10,5, 5,0" Stroke="Black" Fill="Black" Margin="3" Visibility="Visible"/>
<Polygon Name="P_down" Points="0,0 10,0, 5,5" Stroke="Black" Fill="Black" Margin="3" Visibility="Hidden"/>
</StackPanel>
</StackPanel>
</Setter.Value>
</Setter>
<EventSetter Event="Click" Handler="Header_Click"/>
</Style>
当我将此样式设置为我的 ListView (GridViewColumnHeader) 时,如下所示:
<ListView Height="300" x:Name="lv" ItemsSource="{Binding PLCs}">
<ListView.View>
<GridView>
<GridViewColumn Width="120">
<GridViewColumnHeader Name="myNewText" Tag="test" Style="{StaticResource Header}"/>
</GridViewColumn>
<GridViewColumn Width="120">
<GridViewColumnHeader Name="myNewText2" Tag="test2" Style="{StaticResource Header}"/>
</GridViewColumn>
<GridViewColumn Width="120">
<GridViewColumnHeader Tag="test32" Style="{StaticResource Header}"/>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
绑定到祖先 Tag 有效并显示 Polygon,但仅显示 [=20] 的最后一个=]GridViewColumns,前两个留空。谁能告诉我我做错了什么?由于所有三列的代码都相同,我认为它会为所有三列提供相同的结果。我想要么是 Content 绑定 Label 要么是 TargetType 绑定 Style 不正确。
感谢您的帮助。
你应该使用 ContentTemplate
属性:
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<! -- ...place your stack panel here -->
</DataTemplate>
</Setter.Value>
</Setter>
这样,您就为每一列 header 定义了一个 模板 。该模板将独立实例化每一列的内容 header。
如果您使用 Content
属性,您可以将相同的堆栈面板设置为所有列 header 的内容。这行不通 - 只有最后一个会赢。堆栈面板的 parent 将自动设置为最后一个 header。就像:
header1.Content = your_stack_panel;
your_stack_panel.Parent = header1;
header2.Content = your_stack_panel;
your_stack_panel.Parent = header2;
header3.Content = your_stack_panel;
your_stack_panel.Parent = header3;