ListView与GridView,禁用焦点

时间:2014-09-30 14:39:45

标签: c# wpf xaml listview gridview

我正在使用MVVM模式绑定到Entity Framework的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>

这样渲染:

ListView rendering

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

谢谢

2 个答案:

答案 0 :(得分:2)

在我看来,你想要摆脱选择,如果是这种情况你应该使用ItemsControl控制而不是ListView,并使它看起来像ListView列你可以使用共享大小范围Grid作为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之外的另一个bool列添加到每个项目后面的模型中,那么就更容易了,让我们说{{1} },如果为true,则会通过IsTotals使文本变为粗体,如上例所示。如果您无法添加其他列,但 Total 是一个唯一名称,您可以在该

上触发
DataTrigger

答案 1 :(得分:0)

尝试以下内容:

<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 =&#34; True&#34;列表框上的属性,加上SharedSizeGroup =&#34; CountColumn&#34;,使计数显示为在一列中。

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