Список стилей WPF с ItemStyle и DataTemplate - PullRequest
0 голосов
/ 28 октября 2019

Я использую 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.

Но стиль TextBox в ControlTemplate объекта ListBoxItem следует изменить, а также стиль TextBox. в шаблоне данных.

Возможно ли это, или я полностью переместил ControlTemplate в шаблон данных?

1 Ответ

1 голос
/ 28 октября 2019

Я рекомендую переместить все элементы управления, связанные с данными, то есть элементы управления, которые привязываются к элементу 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>
...