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);
});
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
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
@Wobbles Ja, die Eigenschaft get/set ist nur für Sie, das Framework wird die DP verwenden. – nvoigt