ListView.ItemContainerStyle 不适用的问题



简介:

我的代码与此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>
  • 第一项,称为NoRedemptionsControlTemplate,当ListView为空时使用。它实质上删除了GridView的列,只留下一个带有边框的TextBox,告诉用户ListView为空。

  • 第二项,称为CellAlignmentStyleStyle是从上面的链接复制的样式。这应该使CheckBox列居中。

  • 最后一项,称为ListViewTriggerStyleStyle是应用于ListView的样式,基本上删除了对它的绑定(ItemsSourceView(,并将ListViewTemplate设置为NoRedemptions的ControlTemplate(第一个项目符号点(,当ListView(FundRedemptions(的ItemsSource为空时,显示ListView为空的消息。

以下是绑定为ListView ViewGridView(为简单起见,我省略了不相关的列(:

<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更改为CenterRight,但没有奏效。
  • 我尝试更改CheckBox本身的对齐方式,但没有奏效
  • 我尝试将对齐方式添加到 GridView 或ListView样式本身,但这不起作用
  • 我尝试在 SO 帖子的答案中粘贴ListView的精确副本,该副本确实有效
  • 我尝试删除StyleItemsSource的绑定,然后在ListView正文中添加<ListViewItem>Item1</ListViewItem>(以查看它是否与ItemsSourceStyle有关,但这不起作用
  • 我尝试设置CheckBox样式以匹配示例中设置的确切样式,但这不起作用

结语

最让我困惑的是,与帖子中的示例根本没有太大区别,但由于某种原因它不起作用。我想不出还有什么可以尝试的。

u_u


编辑

好的,我已经通过逐步向GridView添加更多样式和触发器,从此处发布的网格中完成了重建网格。

我什么也没找到。

我很沮丧,可能是什么?UserControl.ResourcesStyle s 和 Template s 的顺序发生了变化,这是否会在不引起彻底错误的情况下有所作为?

在这一点上,我太害怕打破它,无法玩弄风格并弄清楚它。

u_u

无法重现这一点,也许您在Application.Resources中有一个或多个样式(例如完整主题(会干扰,这些样式适用于ControlTemplates并可能搞砸事情。

这个问题仍然是一个谜,因为我基本上删除了代码并重建了它并且它起作用了。我无法重现该错误。

对于那些将来看这个问题的人,我确实偶然发现了一个简单而痛苦的明显解决这个问题的方法。如果列将是设置的宽度(我想在大多数情况下,因为复选框的大小大多相同(,您只需为CheckBox设置一个边距即可将CheckBox凸到列的中间。简单。为什么我没有考虑它超出了我的范围,但我真的很想了解我做错了什么。哦...

u_u

最新更新