【问题标题】:ListView with GridView, disable focusableListView 与 GridView,禁用可聚焦
【发布时间】:2026-01-17 16:30:01
【问题描述】:

我正在开发一个遵循 MVVM 模式绑定到实体框架的 WPF 应用程序。 我有一个包含 GridView 的 ListView。

<ListView Grid.Column="0" Grid.Row="1" ItemsSource="{Binding DocumentTypeCount.DocumentTypeCountList}" Width="Auto" Margin="5, 0,0,5" Focusable="False">
    <ListView.View>
            <GridView AllowsColumnReorder="False">
                <GridView.ColumnHeaderContainerStyle>
                        <Style>
                            <Setter Property="FrameworkElement.Visibility" Value="Collapsed" />
                        </Style>
                </GridView.ColumnHeaderContainerStyle>
                <GridViewColumn Header="Document Type" Width="Auto" DisplayMemberBinding="{Binding DocumentTypeName}"/>
                <GridViewColumn Header="Count" Width="Auto" DisplayMemberBinding="{Binding Count}"/>
            </GridView>
    </ListView.View>
</ListView>

这是这样渲染的:

我的问题是: 1-如何禁用对行的关注?我已经尝试过使用 ListViewItem 上的 Focusable 属性,但它没有用。 2- 如何将不同的字体样式(粗体)应用于最后一项?

谢谢

【问题讨论】:

    标签: c# wpf xaml listview gridview


    【解决方案1】:

    在我看来,您想摆脱选择,如果是这种情况,您应该使用 ItemsControl 控件而不是 ListView 并使其看起来像 ListView 列,您可以使用共享大小范围 @987654325 @作为你的ItemTemplate

    <ItemsControl 
        ItemsSource="{Binding DocumentTypeCount.DocumentTypeCountList}"
        Grid.IsSharedSizeScope="True">
        <ItemsControl.ItemTemplate>            
            <DataTemplate>
                <Grid>
                    <Grid.Resources>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="FontWeight" Value="Normal"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsTotals}" Value="True">
                                    <Setter Property="FontWeight" Value="Bold"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Grid.Resources>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="column1"/>
                        <ColumnDefinition SharedSizeGroup="column2"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding DocumentTypeName}" Grid.Column="0"/>
                    <TextBlock Text="{Binding Count}" Grid.Column="1"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    

    至于使最后一个元素显示为粗体,如果您将除DocumentTypeNameCount 之外的另一个布尔列添加到每个项目后面的模型中,假设为IsTotals,这将更容易,如果为真, 将通过DataTrigger 使文本变为粗体,如上例所示。如果您无法添加另一列,但 Total 是一个唯一名称,您可以在该名称上触发

    <DataTrigger Binding="{Binding DocumentTypeName}" Value="Total">
    

    【讨论】:

    • 谢谢。这就是我正在寻找的。​​span>
    【解决方案2】:

    尝试以下方法:

    <ListBox
       Width="Auto"
       Grid.Column="0"
       Grid.Row="1"
       Margin="5, 0,0,5"
       Focusable="False"
       Grid.IsSharedSizeScope="True"
       ItemsSource="{Binding Path=DocumentTypeCount.DocumentTypeCountList}">
       <ListBox.ItemContainerStyle>
          <Style TargetType="{x:Type ListBoxItem}">
             <Setter Property="Template">
                <Setter.Value>
                   <ControlTemplate TargetType="{x:Type ListBoxItem}">
                      <ContentPresenter/>
                   </ControlTemplate>
                </Setter.Value>
             </Setter>
          </Style>
       </ListBox.ItemContainerStyle>
       <ListBox.Resources>
          <DataTemplate DataType="{x:Type DocumentTypes:DocumentType}">
             <Grid>
                <Grid.ColumnDefinitions>
                   <ColumnDefinition Width="Auto" SharedSizeGroup="CountColumn"/>
                   <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding DocumentTypeName}"/>
                <TextBlock Grid.Column="1" Text="{Binding Count}"/>
             </Grid>
          </DataTemplate>
          <DataTemplate DataType="{x:Type DocumentTypes:TotalsDocumentType}">
             <Grid>
                <Grid.ColumnDefinitions>
                   <ColumnDefinition Width="Auto" SharedSizeGroup="CountColumn"/>
                   <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <TextBlock FontWeight="Bold" Text="{Binding DocumentTypeName}"/>
                <TextBlock Grid.Column="1" FontWeight="Bold" Text="{Binding Count}"/>
             </Grid>
          </DataTemplate>
       </ListBox.Resources>
    </ListBox>
    

    需要注意的关键事项是 ItemContainerStyle。这将删除您不想要的突出显示行为。

    其次,我决定使用带有 SharedSizeScope 的列表框。列表框上的 Grid.IsSharedSizeScope="True" 属性与 SharedSizeGroup="CountColumn" 相结合,可以使计数显示为一列。

    此外,要仅以粗体显示最后一行,我建议对不同类型的 ViewModel 执行此操作。在这里,您可以看到我定义了一个“DocumentType”ViewModel 的通用行。对于总计,“TotalsDocumentType”视图模型。这允许我为最后一项提供不同的数据模板(这也可以通过 StyleSelector 完成)。 DocumentType 和 TotalsDocumentType 共享一个公共基类,因此可以包含在同一个 ObservableCollection 中。这些不同类型的视图模型还允许您针对我认为您需要的特定业务逻辑以不同方式处理行。

    【讨论】:

    • 谢谢。我更简单地资助标记的答案。我没有尝试您的解决方案,但我认为它也会起作用。