带有 ItemStyle 和 DataTemplate 的 WPF 样式列表框

WPF Style ListBox with ItemStyle and DataTemplate

我正在使用 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 class。一切都被正确识别,因此在设置 ItemContainerStyle 或 DataTemplateSelector 方面没有任何问题。

但 ListBoxItem 的 ControlTemplate 中的 TextBox 的样式以及 DataTemplate 中的 TextBox 的样式应该更改。

这可能吗,或者我是否已将 ControlTemplate 完全移至 DataTemplate?

我建议移动所有与数据相关的控件,即绑定到项目 DataContext 的控件到 DataTemplate。然后使用 DataTrigger 在针对 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>