2016-11-18 2 views
0

Ich habe andere gesehen, die dieses Problem gelegentlich haben und am besten kann ich sagen, dass ich mehrere Varianten ihrer Korrekturen dupliziert habe, aber noch nicht zum Funktionieren gebracht habe.Abhängigkeitseigenschaft für ein Benutzersteuerelement, das die Eigenschaft nicht aktualisiert, wenn gebundene Daten geändert werden

Ich weiß, dass meine gebundenen Daten richtige INotify-Ereignisse senden, da ich andere Steuerelemente wie Textblöcke an die Daten binden kann und dessen Inhalt sich ändert, wenn sich die Objekteigenschaft ändert, aber mein Benutzersteuerelement scheint das Ereignis überhaupt nicht zu empfangen .

public partial class MappingSelector : UserControl 
{ 
    public Type OutputDriver 
    { 
     get { return (Type)GetValue(OutputDriverProperty); } 
     set { Console.WriteLine(value.ToString()); SetValue(OutputDriverProperty, value); UpdateUI(); } 
    } 

    // Using a DependencyProperty as the backing store for OutPutDriver. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty OutputDriverProperty = 
     DependencyProperty.Register("OutputDriver", typeof(Type), typeof(MappingSelector), new PropertyMetadata(null)); 
    public MappingSelector() 
    { 
     InitializeComponent(); 
     (this.Content as FrameworkElement).DataContext = this; 
     //UpdateUI(); 
    } 
} 

Der Setter hat eine Konsolenspur, die nie ausgelöst wird, also bin ich zuversichtlich, dass die Eigenschaft nie festgelegt wird.

Ich bin dann so bindet mit:

<root:MappingSelector OutputDriver="{Binding LoadedProfile.UsedDriverInterface, ElementName=page, UpdateSourceTrigger=PropertyChanged}"/> 

Und ich weiß, LoadedProfile.UsedDriverInterface aktualisiert und die richtigen Ereignisse zu senden, weil ich das auch haben, die ganz gut funktioniert:

<TextBlock Text="{Binding LoadedProfile.UsedDriverInterface, ElementName=page, UpdateSourceTrigger=PropertyChanged}"/> 

Späte Edit: Das funktioniert, aber ist es wirklich, was ich tun muss? Gibt es keinen besseren Weg? Dies wurde dem Benutzersteuerungskonstruktor hinzugefügt.

 var OutputDriverDPD = DependencyPropertyDescriptor.FromProperty(OutputDriverProperty, typeof(MappingSelector)); 
     OutputDriverDPD.AddValueChanged(this, (sender, args) => 
     { 
      OutputDriver = (Type)GetValue(OutputDriverProperty); 
     }); 

Antwort

2

Der Setter hat eine Konsole Spur, die nie so feuert Ich bin zuversichtlich, dass die Eigenschaft nie gesetzt wird.

Dies ist eine Falle. Die von Ihnen definierten Eigenschaften-Getter und Setter sind für Ihre Bequemlichkeit. Das WPF-Framework ruft sie nicht auf, sondern verwendet die Abhängigkeitseigenschaft direkt. Tue niemals etwas in diesen Gettern und Settern, die du erledigen musst.

Wenn Sie auf Änderungen der Eigenschaften reagieren möchten, verwenden Sie den Rückruf, den Sie bereits entdeckt haben. Ihr Konsolen-Trace sollte sich dort befinden, nicht im Setter.

+0

Der Grund wird hier erklärt: [XAML Laden und Abhängigkeit Eigenschaften] (https://msdn.microsoft.com/en-us/library/bb613563 (v = vs.110) .aspx) – Clemens

+0

Gotcha, also verwenden Sie die DP als "Hub" für alle meine Ereignisse und Bedingungen, und nutzen Sie einfach die Eigenschaft für die Bindung innerhalb der Kontrolle? – Wobbles

+0

@Wobbles Ja, die Eigenschaft get/set ist nur für Sie, das Framework wird die DP verwenden. – nvoigt

Verwandte Themen