GridViewColumn.CellTemplate与TextBox不兼容ListView.ItemContainerStyle

时间:2015-01-01 01:05:34

标签: c# wpf listview

我有一个像这样的ListView:

      <ListView ItemsSource="{Binding Components}"
                      BorderThickness="0"
                      Margin="0,2,0,0"
                      HorizontalAlignment="Stretch"
                      MinHeight="150"
                      SelectionMode="Single"
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="Component Name">
                            <GridViewColumn.CellTemplate>

                                <DataTemplate DataType="{x:Type viewModels:ComponentViewModel}">
                                    <TextBox Text="{Binding Name}"
                                             Style="{StaticResource TextBoxInListViewStyle}">
                                    </TextBox>
                                </DataTemplate>

                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>

这呈现如下所示:

enter image description here

如您所见,使用TextBox(我可以选择文本),但ListViewItemContainer为我提供了我不想要的玻璃选择外观。

然后我为ListView定义了一个ItemContainerStyle(ListViewItemStyle),就像那样(第7行):

      <ListView ItemsSource="{Binding Components}"
                      BorderThickness="0"
                      Margin="0,2,0,0"
                      HorizontalAlignment="Stretch"
                      MinHeight="150"
                      SelectionMode="Single"
                      ItemContainerStyle="{StaticResource ListViewItemStyle}"
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="Component Name">
                            <GridViewColumn.CellTemplate>

                                <DataTemplate DataType="{x:Type viewModels:ComponentViewModel}">
                                    <TextBox Text="{Binding Name}"
                                             Style="{StaticResource TextBoxInListViewStyle}">
                                    </TextBox>
                                </DataTemplate>

                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>

这是我的ListViewItemStyle:

<Style x:Key="ListViewItemStyle"
       TargetType="{x:Type ListViewItem}">
    <Setter Property="SnapsToDevicePixels"
            Value="True" />
    <Setter Property="Padding"
            Value="4,1" />
    <Setter Property="HorizontalContentAlignment"
            Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
    <Setter Property="VerticalContentAlignment"
            Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
    <Setter Property="Background"
            Value="Transparent" />
    <Setter Property="BorderBrush"
            Value="Transparent" />
    <Setter Property="BorderThickness"
            Value="1" />
    <Setter Property="FocusVisualStyle"
            Value="{StaticResource FocusVisual}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border x:Name="Bd"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Background="{TemplateBinding Background}"
                        Padding="{TemplateBinding Padding}"
                        SnapsToDevicePixels="true">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                      ContentTemplate="{TemplateBinding ContentTemplate}" />
                </Border>
                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver"
                                       Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"
                                TargetName="Bd"
                                Value="{StaticResource Item.MouseOver.Background}" />
                        <Setter Property="BorderBrush"
                                TargetName="Bd"
                                Value="{StaticResource Item.MouseOver.Border}" />
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive"
                                       Value="False" />
                            <Condition Property="IsSelected"
                                       Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"
                                TargetName="Bd"
                                Value="{StaticResource Item.SelectedInactive.Background}" />
                        <Setter Property="BorderBrush"
                                TargetName="Bd"
                                Value="{StaticResource Item.SelectedInactive.Border}" />
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive"
                                       Value="True" />
                            <Condition Property="IsSelected"
                                       Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"
                                TargetName="Bd"
                                Value="{StaticResource Item.SelectedActive.Background}" />
                        <Setter Property="BorderBrush"
                                TargetName="Bd"
                                Value="{StaticResource Item.SelectedActive.Border}" />
                    </MultiTrigger>
                    <Trigger Property="IsEnabled"
                             Value="False">
                        <Setter Property="TextElement.Foreground"
                                TargetName="Bd"
                                Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这给了我想要的选择外观。但遗憾的是现在我的CellTemplate中的TextBox模板不再起作用,数据绑定也不起作用:

Good selection but bad template and binding

新年快乐!

1 个答案:

答案 0 :(得分:2)

我解决了!

我不必在我的Style中使用ContentPresenter,而是使用GridRowPresenter!

 <Style x:Key="ListViewItemStyle"
       TargetType="{x:Type ListViewItem}">
    <Setter Property="SnapsToDevicePixels"
            Value="True" />
    <Setter Property="Padding"
            Value="4,1" />
    <Setter Property="HorizontalContentAlignment"
            Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
    <Setter Property="VerticalContentAlignment"
            Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
    <Setter Property="Background"
            Value="Transparent" />
    <Setter Property="BorderBrush"
            Value="Transparent" />
    <Setter Property="BorderThickness"
            Value="1" />
    <Setter Property="FocusVisualStyle"
            Value="{StaticResource FocusVisual}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border x:Name="Bd"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Background="{TemplateBinding Background}"
                        Padding="{TemplateBinding Padding}"
                        SnapsToDevicePixels="true">
                    <GridViewRowPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                       />
                </Border>
                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver"
                                       Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"
                                TargetName="Bd"
                                Value="{StaticResource Item.MouseOver.Background}" />
                        <Setter Property="BorderBrush"
                                TargetName="Bd"
                                Value="{StaticResource Item.MouseOver.Border}" />
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive"
                                       Value="False" />
                            <Condition Property="IsSelected"
                                       Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"
                                TargetName="Bd"
                                Value="{StaticResource Item.SelectedInactive.Background}" />
                        <Setter Property="BorderBrush"
                                TargetName="Bd"
                                Value="{StaticResource Item.SelectedInactive.Border}" />
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive"
                                       Value="True" />
                            <Condition Property="IsSelected"
                                       Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"
                                TargetName="Bd"
                                Value="{StaticResource Item.SelectedActive.Background}" />
                        <Setter Property="BorderBrush"
                                TargetName="Bd"
                                Value="{StaticResource Item.SelectedActive.Border}" />
                    </MultiTrigger>
                    <Trigger Property="IsEnabled"
                             Value="False">
                        <Setter Property="TextElement.Foreground"
                                TargetName="Bd"
                                Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后它看起来像这样:

Working Template!