2009-07-08 14 views
1

Mein Problem ist sicherlich richtig auf meinem Gesicht, aber ich kann es nicht sehen ...WPF - Bindung in einfachen User Control

Ich baue eine sehr einfache Benutzersteuerung - eine 3D-Ellipse - und ich zwei Eigenschaften aussetzen : LightColor und DarkColor. Ich muss diese Eigenschaften an den Farbverlauf in meinem Benutzer Steuerelement binden, aber es zeigt überhaupt keine Farbe. Hier ist mein Usercontrol:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:local="clr-namespace:TestBrushes" 
mc:Ignorable="d" 
x:Class="TestBrushes._3DEllipse" 
x:Name="UserControl" 
d:DesignWidth="200" d:DesignHeight="200"> 
    <Grid x:Name="LayoutRoot"> 
     <Ellipse Name="MainEllipse" Stroke="{x:Null}"> 
      <Ellipse.Fill> 
       <RadialGradientBrush GradientOrigin="0.5,1.1"> 
        <GradientStop Color="{Binding ElementName=UserControl, Path=LightColor}" Offset="1"/> 
        <GradientStop Color="{Binding ElementName=UserControl, Path=DarkColor}" Offset="0"/> 
       </RadialGradientBrush> 
      </Ellipse.Fill> 
     </Ellipse> 
     <Ellipse Name="TopReflectionEllipse" Stroke="{x:Null}" Margin="38,0,38,0" VerticalAlignment="Top" Height="90"> 
      <Ellipse.Fill> 
       <RadialGradientBrush GradientOrigin="0.5,0"> 
        <RadialGradientBrush.RelativeTransform> 
         <TransformGroup> 
          <ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1" ScaleY="1"/> 
          <SkewTransform AngleX="0" AngleY="0" CenterX="0.5" CenterY="0.5"/> 
          <RotateTransform Angle="0" CenterX="0.5" CenterY="0.5"/> 
          <TranslateTransform X="0" Y="0"/> 
         </TransformGroup> 
        </RadialGradientBrush.RelativeTransform> 
        <GradientStop Color="#A5FFFFFF" Offset="0"/> 
        <GradientStop Color="#00FFFFFF" Offset="1"/> 
       </RadialGradientBrush> 
      </Ellipse.Fill> 
     </Ellipse> 
    </Grid> 
</UserControl> 

und hier ist mein Code-behind:

public partial class _3DEllipse 
{ 
    public _3DEllipse() 
    { 
     InitializeComponent(); 
    } 

    public Color DarkColor { get; set; } 
    public Color LightColor { get; set; } 
} 

Wenn ich Farben zuweisen, im Gegensatz zu dem in der gezeigten Code-Bindung, es funktioniert ok, aber ich mag die Eigenschaften verwenden, Ich belichte. Was mache ich falsch?

Danke!

Antwort

3

Ihr Problem ist wahrscheinlich, dass Sie nicht das Benutzersteuerelement von Änderungen an den Wert der DarkColor und Lightcolor Eigenschaften hergestellt werden notifiying. Um dies zu tun, müssen Sie die INotifyPropertyChanged Schnittstelle implementieren. Der Zweck dieser Schnittstelle besteht darin, UI-Komponenten darauf aufmerksam zu machen, wann der Wert, an den sie gebunden sind, aktualisiert wird. Sie abonnieren das PropertyChanged-Ereignis, das durch Implementieren der Schnittstelle verfügbar gemacht wird.

Eine Beispielimplementierung ist unten, ich habe allein die DarkColor Eigenschaft verlassen, aber es würde in der gleichen Art und Weise aktualisiert werden.

public partial class _3DEllipse : INotifyPropertyChanged 
{ 

    private Color _lightColor; 


    public _3DEllipse() 
    { 
     InitializeComponent(); 
    } 

    // interface implementation 
    public event PropertyChangedEventHandler PropertyChanged; 

    public Color DarkColor { get; set; } 
    public Color LightColor 
    { 
     get { return _lightColor; } 
     set 
     { 
      // only update value if its changed 
      if (_lightColor == value) 
      { 
       return; 
      } 

      _lightColor = value; 
      OnPropertyChanged("LightColor"); 
     } 
    } 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged == null) return; 

     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

Ja, du hast Recht. Ich wusste, dass es auf mein Gesicht starrte. Vielen Dank!!! –

+0

Ich habe gerade eine Abhängigkeitseigenschaft verwendet und alles hat gut funktioniert. –

+0

Es genügt, eine DependencyProperty zu verwenden, aber Sie müssen INotifyPropertyChanged implementieren. – rix0rrr