2009-03-25 6 views
2

Ich habe ein UserControl erstellt, das im Wesentlichen eine Schaltfläche ist. Es ist ein Bild und ein Label auf sie, und ich habe zwei Eigenschaften erstellt das Image der Quelle zu setzen und den Text der Bezeichnung wie folgt:C# WPF benutzerdefinierte Steuerelement reagiert nicht auf XAML-Eigenschaften zur Entwurfszeit?

 public ImageSource Icon 
    { 
     get { return (ImageSource)this.GetValue(IconProperty); } 
     set { this.SetValue(IconProperty, value); icon.Source = value; } 
    } 
    public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof(ImageSource), typeof(NavigationButton)); 

    public string Text 
    { 
     get { return (string)this.GetValue(TextProperty); } 
     set { this.SetValue(TextProperty, value); label.Content = value; } 
    } 

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(NavigationButton)); 

Allerdings, wenn ich die Kontrolle meiner Seite hinzugefügt haben, die Kontrollen Ich reagiere nicht auf irgendwelche Eigenschaften, die ich in XAML einstelle, z <controls:MusicButton Icon="/SuCo;component/Resources/settings.png/> tut nichts.

Was mache ich falsch?

Antwort

5

CLR Eigenschaften, die Wrap-Abhängigkeitseigenschaften sollte nie jede andere Logik haben als GetValue und SetValue aufrufen. Das liegt daran, dass sie möglicherweise nicht einmal angerufen werden. Der XAML-Compiler wird beispielsweise optimiert, indem er direkt GetValue/SetValue aufruft, anstatt Ihre CLR-Eigenschaft zu verwenden.

public ImageSource Icon 
{ 
    get { return (ImageSource)this.GetValue(IconProperty); } 
    set { this.SetValue(IconProperty, value); } 
} 

public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof(ImageSource), typeof(NavigationButton), new FrameworkPropertyMetadata(OnIconChanged)); 

private static void OnIconChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
{ 
    //do whatever you want here - the first parameter is your DependencyObject 
} 

EDIT In meiner ersten Antwort, ging ich davon aus XAML

Steuerelements (sei es von a:

Wenn Sie eine gewissen Logik, wenn eine Abhängigkeitseigenschaft geändert wird, Metadaten verwenden, um auszuführen Vorlage oder direkt in einem UserControl) ist korrekt an die Eigenschaften angeschlossen. Du hast uns das XAML nicht gezeigt, also war es vielleicht eine falsche Annahme. Ich würde erwarten, wie etwas zu sehen:

<StackPanel> 
    <Image Source="{Binding Icon}"/> 
    <TextBlock Text="{Binding Text}"/> 
</StackPanel> 

und - wichtiger - Ihre Datacontext muss an die Steuerung selbst eingestellt werden. Sie können dies tun, auf verschiedene Weise, aber hier ist ein sehr einfaches Beispiel davon aus dem Code-Einstellung hinter:

public YourControl() 
{ 
    InitializeComponent(); 
    //bindings without an explicit source will look at their DataContext, which is this control 
    DataContext = this; 
} 
+0

Ich habe ‚dependencyObject.SetValue (Image.SourceProperty, e.NewValue);‘ in die OnIconChanged void und es scheint immer noch nichts zu tun, in Design-und Laufzeit. Selbst das Löschen des Standard-Quellwerts in XAML behebt es nicht. Noch weitere Ratschläge? : P –

+0

Wird meine Hilfe bearbeitet? Wenn nicht, können Sie Ihren gesamten Code und XAML veröffentlichen? –

0

Haben Sie versucht, auch die Texteigenschaft einzustellen? Die Quelle eines Bildes könnte einfach falsch sein. Text ist viel einfacher.

Auch in Ihrem Beispiel haben Sie ein Anführungszeichen verpasst. Wenn es also von Ihrem echten Code kopiert wird, sollten Sie das überprüfen.

Abgesehen von diesen unbedeutend kleinen Ursachen für Ihr Problem, würde ich vorschlagen, die Eigenschaften in Code zu setzen, um zu prüfen, ob das irgendwelche Auswirkungen hat. Wenn dies der Fall ist, sollten Sie Ihren XAML wirklich überprüfen.

Da Sie den Rest Ihres Codes nicht veröffentlicht haben, kann ich nicht wirklich sagen, ob Sie Probleme an einem anderen Ort haben, die das Steuerelement beeinflussen könnten.

Und ja, ich weiß, dass ich nicht sehr hilfreich bin, aber ich arbeite nur eine Weile mit WPF. Hoffe es hilft trotzdem.