C# WPF-如何将setter指向子对象?
我有以下xaml: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
<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>