我有两个孩子DataTemplate
的父DataTemplate
,想要更改子模板的子组件的一个的属性(例如Label.Foreground
,{ {1}}等)基于触发器。我遇到了this post建议TextBox.Background
绑定,但经过多次尝试后我无法使其工作,我不确定如何只影响其中一个子模板。下面显示了我预期的最终结果(任何/所有正确的子属性都需要更改,以显示它们与左子项不同)。
父RelativeSource
xaml:
DataTemplate
然后在ListBox中使用<DataTemplate x:Key="CoupleDataTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<ContentControl Content="{Binding Left}"
ContentTemplate="{StaticResource PersonDataTemplate}"
/>
<Separator Grid.Column="1"
Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}"/>
<ContentControl Content="{Binding Right}"
ContentTemplate="{StaticResource PersonDataTemplate}"
Grid.Column="2"
/>
<!-- Does not work, but shows what I'm trying to do. -->
<!--<ContentControl.Style>
<Style TargetType="{StaticResource PersonDataTemplate}">
<Style.Triggers>
<DataTrigger Binding="{Binding
RelativeSource={RelativeSource FindAncestor,
AncestorType=ListBox},
Path=DataContext.IsFirstDifferent}"
Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>-->
</ContentControl>
</Grid>
</DataTemplate>
:
CoupleDataTemplate
<ListBox ItemsSource="{Binding Couples}"
ItemTemplate="{StaticResource CoupleDataTemplate}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
属性
Couples
我尝试过各种不同的触发器绑定无济于事。我正在努力做甚么可能吗?如果是这样,我错过了什么?
public ObservableCollection<Couple> Couples { get; private set; }
答案 0 :(得分:0)
嗯,有人给出了答案,但出于某种原因将其删除了。它给了我绑定到Foreground
属性的想法。他们曾建议在ContentControl.Tag
中使用CoupleDataTemplate
属性,但这并不适用于多个子组件属性。
从已删除的答案中演变而来的解决方案是使用对DataContext.IsFirstDifferent
属性的相对绑定,并使用IValueConverter将bool
转换为颜色。因此,对于Label
中的每个PersonDataTemplate
,我创建了一个自定义相对绑定。例如:
<Label Grid.Row="0" Grid.Column="0"
HorizontalAlignment="Right"
Name="FirstLabel"
Content="First:"
Foreground="{Binding Path=DataContext.IsFirstDifferent,
RelativeSource={RelativeSource
Mode=FindAncestor, AncestorType={x:Type ContentControl}},
Converter={StaticResource IsDifferentConverter}}"
/>
IsDifferentConverter
来源是:
public class DifferenceConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
return ((Boolean)value) ? "Red" : "Black";
}
public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}