2010-10-07 4 views
6

Le code suivant lie un GradientStop à la propriété Background.Color de TemplatedParent. Tout fonctionne, mais je reçois une erreur obligatoire dans la fenêtre de sortie:La liaison GradientStop fonctionne mais signale une erreur

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

Pourquoi ne pas lier l'arrière-plan lui-même, par rapport à la couleur spécifique dans le dégradé? –

+0

Le BorderBrushis est également lié à la couleur (solide). Je souhaite donc définir la couleur une seule fois et que le dégradé utilise la même couleur pour Gradientstop. (Et je veux aussi savoir pourquoi je reçois une erreur quand cela fonctionne) – McCrille

Répondre

1

moi avons eu aussi la même erreur dans la sortie de la console Visual Studio.

Une explication possible et solution de contournement pour cela est signalé here

Fondamentalement, si vous utilisez un convertisseur qui retourne un LinearGradientBrush alors vous ne recevez pas l'erreur

Le code est quelque chose comme ça

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

Et dans le XAML

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

Cette réponse me semble utile. Cependant, il contourne fondamentalement le problème sous-jacent en effectuant le travail problématique dans code-behind. Ce serait bien de savoir comment obtenir ** XAML ** pour gérer de tels scénarios avec élégance. (Notez également que votre lien vers "explication possible et solution de contournement" n'existe plus ... exemple classique de la raison pour laquelle tous les détails pertinents doivent toujours être copiés dans la réponse SO elle-même, même s'ils existent ailleurs sur le web). –

Questions connexes