首页 > 解决方案 > 带有 ItemStyle 和 DataTemplate 的 WPF 样式列表框

问题描述

我正在使用 WPF 4.5.2 和 .Net 4.7.2

我的基本风格看起来像这样

<Style x:Key="MyListBoxItem" TargetType="{x:Type ListBoxItem}" >

    <Setter Property="Template">

        <Setter.Value>

            <ControlTemplate TargetType="{x:Type ListBoxItem}">

                <Grid>

                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"  />
                        <ColumnDefinition Width="*"     />
                    </Grid.ColumnDefinitions>


                    <Border Grid.Column="0" BorderBrush="Black" BorderThickness="1,0,1,1">

                        <TextBox    Text="{Binding MyText}" />

                    </Border>


                    <Border Grid.Column="1" BorderBrush="Black" BorderThickness="0,0,1,1">

                        <ContentPresenter />

                    </Border>

                </Grid>


            </ControlTemplate>

        </Setter.Value>

    </Setter>

</Style>

此外,有几个 DataTemplates 看起来像这样

<DataTemplate x:Key="SomeDataTemplate">

    <TextBox    Text="{Binding SomeString}" x:Name="txtContent"  Style="{DynamicResource MyStyle}" />

</DataTemplate>

我正在使用 DataTemplateSelector 类。一切都被正确识别,因此在设置 ItemContainerStyle 或 DataTemplateSelector 方面没有任何问题。

但是ListBoxItem的ControlTemplate中TextBox的样式应该和DataTemplate中TextBox的样式一样改变。

这是可能的还是我已经将 ControlTemplate 完全移到了 DataTemplate 中?

标签: wpfstylesdatatemplate

解决方案


我建议移动所有与数据相关的控件,即绑定到项目的控件DataContextDataTemplate. 然后使用 aDataTrigger在针对TextBox.

<DataTemplate x:Key="SomeDataTemplate">
  <StackPanel>
    <TextBox x:Name="TxtContent" 
             Style="{StaticResource DefaultStyle}" />

    <TextBox x:Name="OtherTxtContent"
             Style="{StaticResource OtherDefaultStyle}" />
  </StackPanel>


  <DataTemplate.Triggers>
    <DataTrigger Binding="{Binding SomeProperty}" Value="True" >
      <Setter TargetName="TxtContent" Property="Style" Value="{StaticResource AlternativeTextBoxStyle}" />
      <Setter TargetName="OtherTxtContent" Property="Style" Value="{StaticResource OtherAlternativeTextBoxStyle}" />
    </DataTrigger>
  </DataTemplate.Triggers>
</DataTemplate>

推荐阅读