从父级继承前景值,就像 UWP 中的 TextBlock

Inherit foreground value from the parent just as TextBlock in UWP

当我在我的 ListViewItem style 中设置 SelectedForeground 时,项目 DataTemplate 中的 TextBlock 按预期更改了选择时的颜色。我希望将相同的颜色应用于 DataTemplate 中的其他元素,例如路径或矩形:

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid>
            <TextBlock Text="Hello" />
            <Path Fill={?} />
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

我尝试创建自定义控件并应用模板:

<ControlTemplate x:Key="myControlTemplate" TargetType="local:myControl">
    <Grid>
        <TextBlock Text="Hello" />
        <Path Fill="{Binding Foreground, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
    </Grid>
</ControlTemplate>

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid>
            <controls:myControl Template="{StaticResource myControlTemplate}"/>            
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

在那种情况下,路径确实继承了 ListViewItemPresenter 的值,但只有一次 - 它不会在选择更改时更新值。

如何强制 Path.Fill 属性 像 TextBlock 一样更新它的颜色?

ControlTemplate 中,"templated parent" 是控件本身,因此将自定义控件添加到组合中对您没有任何帮助。

您可能想要的是这个。我无法在此处的 UWP 中对其进行测试,所以如果您遇到任何错误,请告诉我。

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid>
            <TextBlock Text="Hello" />
            <Path 
                x:Name="MyPath"
                Fill="YellowGreen"
                Data="M 0,0 L 16,0 L 16,16 L 0,16 Z"
                />
        </Grid>
        <DataTemplate.Triggers>
            <DataTrigger 
                Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}" 
                Value="True">
                <Setter 
                    TargetName="MyPath"
                    Property="Fill"
                    Value="{Binding SelectedForeground, RelativeSource={RelativeSource AncestorType=ListView}}" 
                    />
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</ListView.ItemTemplate>

您可以直接在 listView 的项模板中使用 relativeSource。

        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Rectangle Width="24"
                               Height="24"
                               Fill="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}"/>
                    <TextBlock Text="{Binding}"
                               x:Name="TitleBlock"/>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>