C# 从父级继承前景值,就像UWP中的TextBlock一样

C# 从父级继承前景值,就像UWP中的TextBlock一样,c#,xaml,uwp,uwp-xaml,C#,Xaml,Uwp,Uwp Xaml,当我在my中设置SelectedForeground时,item DataTemplate中的TextBlock会按预期更改所选内容的颜色。我希望将相同的颜色应用于DataTemplate中的其他元素,例如路径或矩形: <ListView.ItemTemplate> <DataTemplate> <Grid> <TextBlock Text="Hello" /> <Pat

当我在my中设置SelectedForeground时,item 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
中,“模板化父对象”是控件本身,因此在混合中添加自定义控件不会有任何帮助

你可能想要的是这个。我不能在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>


UpdateSourceTrigger=PropertyChanged
添加到
Path.Fill
上的绑定时,您的理由是什么?没有什么特别的原因,我只是多次尝试让它工作。恐怕UWP中不支持DataTrigger和AncestorType。我可以尝试使用元素名查找ListViewItem,尽管我希望避免这种情况。myControl的基类是Control,它包含前台属性。我希望它能自动继承ListViewItem的值,就像TextBlock一样。谢谢,这正是我想要的!