2010-10-07 5 views
6

Der folgende Code bindet eine GradientStop an die Background.Color-Eigenschaft von TemplatedParent. Alles funktioniert, aber ich bin einen verbindlichen Fehler im Ausgabefenster bekommen:Binding GradientStop funktioniert, meldet aber Fehler

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Background.Color; DataItem=null; target element is 'GradientStop' (HashCode=6944299); target property is 'Color' (type 'Color')

<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> 
+0

Warum binden Sie nicht den Hintergrund selbst und die Farbe im Verlauf? –

+0

Die BorderBrushis ist auch an die Farbe (fest) gebunden, also möchte ich die Farbe nur einmal einstellen und den Gradienten die gleiche Farbe für Gradientstop verwenden. (Und ich möchte auch wissen, warum ich einen Fehler erhalte, wenn es funktioniert) – McCrille

Antwort

1

Ich hatte auch den gleichen Fehler in der Visual Studio-Konsole ausgegeben.

Eine mögliche Erklärung und Abhilfe für dieses berichtet here

Grundsätzlich, wenn Sie einen Converter verwenden, die eine LinearGradientBrush kehrt dann erhalten Sie den Fehler nicht

Der Code so etwas wie dieses

ist
[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(); 
    } 
} 

Und in der XAML

<Border BorderThickness="1" BorderBrush="{TemplateBinding Background}" Background="{Binding Path=Background.Color, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource gradConv}}"> 
+4

Diese Antwort scheint mir nützlich. Im Grunde geht es jedoch um das zugrundeliegende Problem, indem es die problematische Arbeit in Code-behind ausführt. Es wäre sicher schön zu wissen, wie man ** XAML ** bekommt, um solche Szenarien anmutig zu behandeln. (Beachten Sie auch, dass Ihr Link zu "mögliche Erklärung und Problemumgehung" nicht mehr existiert ... klassisches Beispiel dafür, warum relevante Details _always_ in die SO-Antwort selbst kopiert werden sollten, selbst wenn sie irgendwo anders im Web existieren). –

Verwandte Themen