带有 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>
我正在使用 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>