2017-06-07 2 views
0

Wo dies die clr Art und Weise des Schreibens eine Eigenschaft ist:Wie Verwenden eines programmatischen Get-Äquivalents in einer WPF-Abhängigkeitseigenschaft?

public byte Value 
{ 
    get{ 
    return GetByteData(); 
    } 
    set{ 
    SetByteData(value); 
    } 
} 

ich gelesen habe auf, wie die gleiche Art und Weise die Abhängigkeitseigenschaft zu tun, und das ist alles, was ich von mir selbst tun könnte:

public byte Value 
{ 
    get { return (byte)GetValue(ValueProperty); } 
    set { SetValue(ValueProperty, value); } 
} 

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
    "Value", typeof(byte), typeof(MyControl), 
    new FrameworkPropertyMetadata((byte)0, ValueChanged)); 

public static void ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    byte r = (byte)e.NewValue; 
    MyControl v = (MyControl)d; 
    v.SetByteData(r); 
} 

Mit den Beispielen, die ich mir angesehen habe, aus denen ich das obige Snippet gemacht habe, kann ich keinen Platz finden, um die GetByteData() zu setzen, die einen Ausgabewert für den aktuellen UI-Zustand berechnet, wenn der Benutzer interagiert, um den "Wert" zu aktualisieren.

Bis vorhin habe ich es irgendwie in den Getter wie mit clr, aber ich habe das Gefühl, dass es falsch ist, aber ich könnte falsch liegen. Wo soll ich es hinstellen? Wenn nicht, wie soll ich vorgehen? Ist es überhaupt möglich, einen programmatischen Getter für eine Abhängigkeitseigenschaft zu haben?

Es ist möglich, dass ich die falschen Schlüsselwörter verwendet habe, um nach einer Lösung zu suchen. Jede Hilfe, die mich in die richtige Richtung bringt, wäre sehr willkommen. Danke im Voraus.

+2

Leider Abhängigkeitseigenschaften haben nicht ein "get Rückruf". Ihr Getter liefert immer nur den Wert, der zuvor festgelegt wurde (entweder direkt oder durch eine Bindung, einen Stil, einen Standardwert usw.). Warum muss Ihre Immobilie überhaupt eine Abhängigkeitseigenschaft sein? – Clemens

+1

Beachten Sie auch, dass die Zuweisung 'v.Value = r' im PropertyChangedCallback redundant ist. Die Eigenschaft hat diesen Wert bereits. Ich habe es aus Ihrem Beispielcode entfernt. – Clemens

+0

Oh! Ein ganz anderer Ansatz! Das bedeutet, dass ich den Abhängigkeitswert aktualisieren muss, indem ich jedes Mal ein Ereignis auslöst, wenn der Benutzer interagiert? Ich nehme an, dass "SetByteData" jedes Mal verwenden würde, um die Benutzeroberfläche zu synchronisieren. Irgendwie überflüssig, aber ich denke, ich könnte eine Zustandsvariable verwenden, um das Wiederholen zu überspringen. @why es muss Abhängigkeit sein: Ich brauche ein anderes UI-Element zu tun: '{Binding Value, ElementName = MyControlName}'. Ich bin mir nicht sicher, ob das mit Clr-Eigenschaften funktionieren würde ... – RiA

Antwort

1

Solange es nur die Quelle (und nicht das Ziel) Eigenschaft einer Bindung, wie in

{Binding Value, ElementName=MyControlName} 

und Sie nicht wollen, einen Wert von einem Stil Setter anzuwenden oder animieren die Wert, muss die Eigenschaft keine Abhängigkeitseigenschaft sein.

implementieren Nur INotifyPropertyChanged wie folgt aus:

public partial class MyControl : UserControl, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public byte Value 
    { 
     get { return GetByteData(); } 
     set 
     { 
      SetByteData(value); 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value))); 
     } 
    } 

    ... 
} 
+0

Ich werde es vielleicht auch als Ziel benötigen, schließlich. Aber ich habe noch keinen Platz gefunden, um es auf diese Weise umzusetzen. Es ist eigentlich ein Steuerelement, das ein "Byte" mit einer Reihe von Togglebuttons zeigt, die einzelne Bits darstellen. Und ein Abschnitt für die manuelle Eingabe der Nummer innerhalb derselben Benutzersteuerung. Es ist also eine Art Bibliothekssteuerung, die ich an vielen Orten einsetzen möchte. Eine Abhängigkeitseigenschaft könnte hilfreich sein. Ich werde versuchen, den Abhängigkeitswert jedes Mal zu aktualisieren, wenn der Benutzer mit meinem Steuerelement interagiert, und sehen, wie das funktioniert. – RiA

+0

Danke auch für die 'PropertyChanged? .Invoke'-Syntax. Ich habe mich gefragt, wie ich diese Arbeit machen soll, da ich an die C++ - Art gewöhnt bin, nur 'PropertyChanged (this, new ...);' – RiA

+0

Danke für die Anleitung. Ich habe es geschafft, es zum Laufen zu bringen. Schreib einfach, dass wpf getters nicht so funktionieren oder dass ich es manuell aktualisieren muss. Ich werde es als Antwort markieren, da dies für die Frage am relevantesten wäre. :) – RiA

Verwandte Themen