C# WPF-如何将setter指向子对象?

C# WPF-如何将setter指向子对象?,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有以下xaml: <Canvas Name="MainCanvas" Style="{StaticResource MainCanvasStyle}"> <ListView Name="MainListView" Style="{StaticResource MainListViewStyle}" ItemsSource="{Binding Items}"> <ListView.ItemTemplate> &l

我有以下xaml:

<Canvas Name="MainCanvas" Style="{StaticResource MainCanvasStyle}">
    <ListView Name="MainListView" Style="{StaticResource MainListViewStyle}" ItemsSource="{Binding Items}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Path=Status}" Value="dnd">
                        <Setter TargetName="CanvasItem" Property="Canvas.Background" Value="Orange"/>
                    </DataTrigger>
                </DataTemplate.Triggers>
                <Canvas Name="CanvasItem" Height="30" Width="222" Margin="10,5,10,5">
                    <Canvas.Background>
                        <LinearGradientBrush>
                            <GradientStop Offset="0" Color="Orange"/>
                            <GradientStop Offset="1"  Color="{Binding Background, ElementName=CanvasItem}"/>
                        </LinearGradientBrush>
                    </Canvas.Background>
                    <TextBlock Text="{Binding Number}" TextAlignment="Justify" FontSize="18" Width="150" Canvas.Top="2" Canvas.Left="10" FontWeight="Thin"/>
                    <TextBlock Text="{Binding Status}" TextAlignment="Right" FontSize="18" Width="50" Canvas.Top="2" Canvas.Right="5" FontWeight="DemiBold"/>
                </Canvas>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Canvas>

我试图实现的是根据Items.Status的当前值更改画布Items中LinearGradientBrush的第二种颜色

我想通过在我的setter中瞄准LinearGradientBrush in CanvasItem中的颜色来实现这一点。这怎么可能呢? 如果有更好的方法,我愿意接受建议

我的另一个想法是在ViewModel中处理,但我不确定是否可以将它们绑定到此ListView,因为我的ItemsSource已设置为Items,我不想修改保存这些项的类

///虽然这个问题仍然没有得到回答,但我通过将Setter部分更改为:

<Setter TargetName="CanvasItem" Property="Canvas.Background">
    <Setter.Value>
        <LinearGradientBrush>
            <GradientStop Offset="0" Color="Orange"/>
            <GradientStop Offset="1" Color="Red"/>
        </LinearGradientBrush>
    </Setter.Value>
</Setter>

我还删除了CanvasItem中带有Canvas.Background的部分


这需要我将该片段复制并粘贴到每个setter中,这比引用setter中的确切颜色(第二个GradientStop中的颜色)更不舒服。我的代码中大约有十种不同的颜色设置器,所以你可以想象这看起来有多笨拙。

嗯……如果你正试图这样做,你不能将
渐变停止
颜色
绑定到
渐变停止
所属的同一个
LinearGradientBrush

不过,您可以绑定到另一个属性。您可以使用
标记
属性,也可以定义自己附加的
笔刷
属性:

<DataTemplate>
    <Canvas Name="CanvasItem" Height="30" Width="222" Margin="10,5,10,5">
        <!-- default value -->
        <Canvas.Tag>
            <SolidColorBrush>Green</SolidColorBrush>
        </Canvas.Tag>
        <Canvas.Background>
            <LinearGradientBrush>
                <GradientStop Offset="0" Color="Orange"/>
                <GradientStop Offset="1"  Color="{Binding Tag.Color, ElementName=CanvasItem}"/>
            </LinearGradientBrush>
        </Canvas.Background>
        <TextBlock Text="Number" TextAlignment="Justify" FontSize="18" Width="150" Canvas.Top="2" Canvas.Left="10" FontWeight="Thin"/>
        <TextBlock Text="Status" TextAlignment="Right" FontSize="18" Width="50" Canvas.Top="2" Canvas.Right="5" FontWeight="DemiBold"/>
    </Canvas>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=Status}" Value="dnd">
            <Setter TargetName="CanvasItem" Property="Tag">
                <Setter.Value>
                    <SolidColorBrush>Orange</SolidColorBrush>
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

绿色
橙色

我不明白你的意图,所以我不知道这是否是个好主意。
但你似乎想这么做。。。 您可以在渐变停止中命名颜色:

<LinearGradientBrush>
    <GradientStop Offset="0" Color="Orange"/>
    <GradientStop Offset="1">
        <GradientStop.Color x:Name="MyColour">Red</GradientStop.Color>
    </GradientStop>
</LinearGradientBrush>
其中引用的旋转变换形式如下所示:

<ContentControl.RenderTransform>
    <TransformGroup>
        <ScaleTransform/>
        <SkewTransform/>
        <RotateTransform/>
        <TranslateTransform/>
    </TransformGroup>
</ContentControl.RenderTransform>


不确定您的真实意图,但背景是画笔,颜色是颜色。不同类型。。当然,你正试图与你所设定的东西相结合。这也是一个问题。然后你还试图再次设置背景,但是你已经设置了一个值。你想要达到什么样的最终结果?问题不在于颜色不改变,而在于它们被覆盖了。当前setter不能像预期的那样工作-它被绑定到Canvas.Background的整体颜色,但我想将它绑定到Canvas.Background.LinearGradientBrush。(第二)GradientStop.color。我只是不知道怎么做。想法是先用setter设置背景,然后再设置背景,但这次将背景设置为LinearGradientBrush,其中偏移量为0的第一种颜色始终为橙色,偏移量为1的第二种颜色为当前颜色。但这不起作用,我得到的是纯色-由setter设置的,而不是由零件设置的。我仍然感到困惑,但您可以将颜色定义为资源或命名颜色并将另一种颜色绑定到它,或者您可以使用路径语法查找画布,从gradientstop by index获取渐变色,然后引用渐变色中的颜色。如果我将LinearGradientBrush中的颜色绑定到资源颜色,然后绑定到资源颜色,会不会导致每个ListViewItem的画布上都有相同的颜色?
<ContentControl.RenderTransform>
    <TransformGroup>
        <ScaleTransform/>
        <SkewTransform/>
        <RotateTransform/>
        <TranslateTransform/>
    </TransformGroup>
</ContentControl.RenderTransform>