c# - 祖先绑定在 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,但仅对于GridViewColumns的最后一个,前两个保持空白。谁能告诉我我做错了什么?由于所有三列的代码都是相同的,我认为它会为我提供所有三列的相同结果。我猜标签的内容绑定或样式的目标类型不正确。
谢谢你的帮助。
解决方案
您应该使用以下ContentTemplate
属性:
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<! -- ...place your stack panel here -->
</DataTemplate>
</Setter.Value>
</Setter>
这样做,您为每个列标题定义一个模板。模板将独立实例化每个列标题的内容。
如果使用该Content
属性,则将与内容相同的堆栈面板设置为所有列标题。这是行不通的——只有最后一个会赢。堆栈面板的父级将自动设置为最后一个标题。就像是:
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;
推荐阅读
- python - 阻止 Sphinx 执行缓存的 classmethod 属性
- r - R中的Cumsum函数逐步
- node.js - 使用 quick.db 检查用户是否有特定对象
- php - 相同的 PHP 脚本不适用于 2 个差异很小的站点
- javascript - ./.cache/root.js:21 中的函数 RouteHandler 出错
- c++ - 将用户输入的时间转换为 Unix 时间戳
- javascript - 有没有比将 DOM 元素一个一个分配给变量的替代方法或更好的方法?
- php - 致命错误:未捕获的错误:调用 PHP 中未定义的函数 call()
- java - 布尔值与为方法调用调用 println 和为包含方法调用的布尔返回值的变量调用 println 不同
- sql - 无法理解 DBMS 中数值数据类型的精度和小数位数