简介:
我的代码与此SO问题中讨论的代码非常相似。我在ListView
中有一个CheckBox
列(它使用GridView
因为它是View
(,我正在尝试将CheckBox
对齐以在列内居中。
答案建议添加一个ItemContainerStyle
,将HorizontalContentAlignment
设置为 Center
.我已经尝试过这个,但它没有应用样式。
法典:
这是我到目前为止的代码:
<ControlTemplate x:Key="NoRedemptions">
<Border BorderBrush="#FF7F9DB9" HorizontalAlignment="Stretch" BorderThickness="1" Background="White">
<TextBlock Text="No Redemptions have been added" HorizontalAlignment="Center"></TextBlock>
</Border>
</ControlTemplate>
<Style x:Key="CellAlignmentStyle" TargetType="{x:Type ListViewItem}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
<Style TargetType="ListView" x:Key="ListViewTriggersStyle">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=FundRedemptions.Count, UpdateSourceTrigger=PropertyChanged}" Value="0">
<Setter Property="ItemsSource" Value="{x:Null}"></Setter>
<Setter Property="View" Value="{x:Null}"></Setter>
<Setter Property="Template" Value="{StaticResource NoRedemptions}"/>
</DataTrigger>
</Style.Triggers>
</Style>
第一项,称为NoRedemptions的
ControlTemplate
,当ListView
为空时使用。它实质上删除了GridView
的列,只留下一个带有边框的TextBox
,告诉用户ListView
为空。第二项,称为CellAlignmentStyle的
Style
是从上面的链接复制的样式。这应该使CheckBox
列居中。最后一项,称为ListViewTriggerStyle的
Style
是应用于ListView
的样式,基本上删除了对它的绑定(ItemsSource
和View
(,并将ListView
的Template
设置为NoRedemptions的ControlTemplate
(第一个项目符号点(,当ListView
(FundRedemptions(的ItemsSource
为空时,显示ListView
为空的消息。
以下是绑定为ListView
View
的GridView
(为简单起见,我省略了不相关的列(:
<GridView AllowsColumnReorder="False" x:Key="ListViewView">
<GridViewColumn x:Name="checkedColumn" Header="Checked" Width="Auto">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></CheckBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
这是有问题的ListView本身:
<ListView
Grid.Row="3"
Style="{StaticResource ListViewTriggersStyle}"
ItemContainerStyle="{StaticResource CellAlignmentStyle}"
Grid.ColumnSpan="5"
View="{StaticResource ListViewView}"
ItemsSource="{Binding Path=FundRedemptions, UpdateSourceTrigger=PropertyChanged}">
</ListView>
解决问题的尝试
现在如上所述,项目符号 2 中描述的Style
,即从上述链接"借用"的那个,不适用于我的ListView
.
- 我尝试使用
HorizontalAlignment
而不是HorizontalContentAlignment
,但没有奏效。 - 我尝试将其他二传手添加到样式中,看看它是否被应用并且这些二传手确实有效
- 我尝试更改
VerticalAlignment
以查看它是否是对齐问题,并且确实有效。 - 我尝试从 SO 帖子建议的
Stretch
更改为Center
或Right
,但没有奏效。 - 我尝试更改
CheckBox
本身的对齐方式,但没有奏效 - 我尝试将对齐方式添加到 GridView 或
ListView
样式本身,但这不起作用。 - 我尝试在 SO 帖子的答案中粘贴
ListView
的精确副本,该副本确实有效 - 我尝试删除
Style
和ItemsSource
的绑定,然后在ListView
正文中添加<ListViewItem>Item1</ListViewItem>
(以查看它是否与ItemsSource
或Style
有关,但这不起作用。 - 我尝试设置
CheckBox
样式以匹配示例中设置的确切样式,但这不起作用。
结语
最让我困惑的是,与帖子中的示例根本没有太大区别,但由于某种原因它不起作用。我想不出还有什么可以尝试的。
u_u
编辑
好的,我已经通过逐步向GridView
添加更多样式和触发器,从此处发布的网格中完成了重建网格。
我什么也没找到。
我很沮丧,可能是什么?UserControl.Resources
中 Style
s 和 Template
s 的顺序发生了变化,这是否会在不引起彻底错误的情况下有所作为?
在这一点上,我太害怕打破它,无法玩弄风格并弄清楚它。
u_u
无法重现这一点,也许您在Application.Resources
中有一个或多个样式(例如完整主题(会干扰,这些样式适用于ControlTemplates
并可能搞砸事情。
这个问题仍然是一个谜,因为我基本上删除了代码并重建了它并且它起作用了。我无法重现该错误。
对于那些将来看这个问题的人,我确实偶然发现了一个简单而痛苦的明显解决这个问题的方法。如果列将是设置的宽度(我想在大多数情况下,因为复选框的大小大多相同(,您只需为CheckBox
设置一个边距即可将CheckBox
凸到列的中间。简单。为什么我没有考虑它超出了我的范围,但我真的很想了解我做错了什么。哦...
u_u