通过绑定动态更改DataTemplate样式

时间:2014-06-24 12:34:17

标签: c# wpf binding datatemplate

我有两个孩子DataTemplate的父DataTemplate,想要更改子模板的子组件的一个的属性(例如Label.Foreground,{ {1}}等)基于触发器。我遇到了this post建议TextBox.Background绑定,但经过多次尝试后我无法使其工作,我不确定如何只影响其中一个子模板。下面显示了我预期的最终结果(任何/所有正确的子属性都需要更改,以显示它们与左子项不同)。

enter image description here

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

我尝试过各种不同的触发器绑定无济于事。我正在努力做甚么可能吗?如果是这样,我错过了什么?

每个请求的PersonDataTemplate

public ObservableCollection<Couple> Couples { get; private set; }

1 个答案:

答案 0 :(得分:0)

嗯,有人给出了答案,但出于某种原因将其删除了。它给了我绑定到Foreground属性的想法。他们曾建议在ContentControl.Tag中使用CoupleDataTemplate属性,但这并不适用于多个子组件属性。

从已删除的答案中演变而来的解决方案是使用对DataContext.IsFirstDifferent属性的相对绑定,并使用IValueConverterbool转换为颜色。因此,对于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;
    }

}