绑定GradientStop可以工作但报告错误

McC*_*lle 6 wpf binding

以下代码将a绑定GradientStopBackground.Color属性TemplatedParent.一切正常但我在输出窗口中收到绑定错误:

System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement.BindingExpression:路径= Background.Color; 的DataItem = NULL; target元素是'GradientStop'(HashCode = 6944299); 目标属性是'颜色'(类型'颜色')

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="WpfBindingTest.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="100" Height="100">
<Window.Resources>
    <ControlTemplate x:Key="GradientTemplate" TargetType="{x:Type ContentControl}">
        <Border BorderThickness="1" BorderBrush="{TemplateBinding Background}">
            <Border.Background>
                <LinearGradientBrush  EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="{Binding Path=Background.Color, 
                        RelativeSource={RelativeSource TemplatedParent}}"  Offset="1"/>
                    <GradientStop Color="White"  Offset="0"/>
                </LinearGradientBrush>
            </Border.Background>
            <ContentPresenter/>
        </Border>
    </ControlTemplate>
</Window.Resources>

<Grid x:Name="LayoutRoot">
    <ContentControl Background="Green" Template="{StaticResource GradientTemplate}" >
        <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Text="X" />
    </ContentControl>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

Kla*_*s78 1

我在 Visual Studio 控制台输出中也遇到了同样的错误。

此处报告了对此可能的解释和解决方法

基本上,如果您使用返回 LinearGradientBrush 的转换器,那么您不会收到错误

代码是这样的

[ValueConversion(typeof(System.Windows.Media.Color), typeof(LinearGradientBrush))]
class GradientConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var brush = new LinearGradientBrush();
        var color = (Color)value;
        brush.StartPoint = new Point(0.5, 0);
        brush.EndPoint = new Point(0.5, 1);

        brush.GradientStops.Add(new GradientStop(Colors.White, 0));
        brush.GradientStops.Add(new GradientStop((Color)value, 1));

        return brush;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

在 XAML 中

<Border BorderThickness="1" BorderBrush="{TemplateBinding Background}" Background="{Binding Path=Background.Color, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource gradConv}}">
Run Code Online (Sandbox Code Playgroud)

  • 这个答案对我来说似乎很有用。然而,它基本上通过在代码隐藏中完成有问题的工作来回避根本问题。如果知道如何让 **XAML** 优雅地处理此类场景,那就太好了。(另请注意,您指向“可能的解释和解决方法”的链接不再存在......为什么任何相关细节都应该_始终_复制到SO答案本身中的经典示例,即使它们存在于网络上的其他地方)。 (6认同)