bindingcontext binding uwp dependencyobject

bindingcontext - Establecer enlaces para DependencyObjects personalizados



xamarin forms label text format (2)

No estoy seguro de por qué en UWP un enlace de una vía de una propiedad de dependencia a otra no actualiza automáticamente la propiedad de destino (como lo hace en WPF).

Sin embargo, simplemente podría revertir la dirección del Enlace y hacerlo de dos direcciones:

var b = new Binding { Source = we1, Path = new PropertyPath("Width"), Mode = BindingMode.TwoWay }; BindingOperations.SetBinding(we2, WindowsElement.ActualWidthProperty, b); we2.ActualWidth = 13;

Esta es la continuación de una pregunta aquí: intentar configurar un DependencyObject personalizado. Claramente falta algo . No es práctico editar la pregunta original; los cambios son demasiado grandes Así que estoy empezando una nueva pregunta.

Estoy intentando configurar enlaces entre los objetos DependencyObjects personalizados en mi aplicación UWP. El código relevante está debajo. Estoy viendo llamadas a ActualWidthPropertyChanged, pero no están activando ninguna llamada a WidthPropertyChanged. ¿Qué me estoy perdiendo?

class WindowsElement: DependencyObject { public WindowsElement() { } public double Width { get { return (double)GetValue(WidthProperty); } set { SetValue(WidthProperty, value); } } private static void WidthPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { WindowsElement element = (WindowsElement)o; double width = (double)e.NewValue; CommonDebug.LogLine("WPC", element, o, width); element.Width = width; } private static void ActualWidthPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { WindowsElement element = (WindowsElement)o; double width = (double)e.NewValue; CommonDebug.LogLine("AWPC", o, e, width, element.Width); element.ActualWidth = width; } public static readonly DependencyProperty WidthProperty = DependencyProperty.Register( "Width", typeof(double), typeof(WindowsElement), new PropertyMetadata((double)0, WidthPropertyChanged)); public double ActualWidth { get { return (double)GetValue(ActualWidthProperty); } set { SetValue(ActualWidthProperty, value); } } public static readonly DependencyProperty ActualWidthProperty = DependencyProperty.Register( "ActualWidth", typeof(double), typeof(WindowsElement), new PropertyMetadata((double)0, ActualWidthPropertyChanged)); public static void MessWithBindings() { WindowsElement we1 = new WindowsElement(); WindowsElement we2 = new WindowsElement(); var b = new Binding { Source = we2, Path = new PropertyPath("ActualWidth") }; BindingOperations.SetBinding(we1, WindowsElement.WidthProperty, b); we2.ActualWidth = 13; CommonDebug.LogLine(we1, we1.Width, we1.ActualWidth, we2, we2.Width, we2.ActualWidth); } }


Estoy viendo llamadas a ActualWidthPropertyChanged, pero no están activando ninguna llamada a WidthPropertyChanged. ¿Qué me estoy perdiendo?

Para resolver esta pregunta, deberá implementar la interfaz INotifyPropertyChanged en el objeto de origen para que la fuente pueda informar los cambios.

Por favor mira el siguiente código:

class WindowsElement : DependencyObject, INotifyPropertyChanged { public WindowsElement() { } public double Width { get { return (double)GetValue(WidthProperty); } set { SetValue(WidthProperty, value); } } private static void WidthPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { WindowsElement element = (WindowsElement)o; double width = (double)e.NewValue; CommonDebug.LogLine("WPC", element, o, width); //element.Width = width; element.RaisedPropertyChanged("Width"); } private static void ActualWidthPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { WindowsElement element = (WindowsElement)o; double width = (double)e.NewValue; CommonDebug.LogLine("AWPC", o, e, width, element.Width); //element.ActualWidth = width; element.RaisedPropertyChanged("ActualWidth"); } public event PropertyChangedEventHandler PropertyChanged; private void RaisedPropertyChanged(string PropertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName)); } public static readonly DependencyProperty WidthProperty = DependencyProperty.Register( "Width", typeof(double), typeof(WindowsElement), new PropertyMetadata((double)0, WidthPropertyChanged)); public double ActualWidth { get { return (double)GetValue(ActualWidthProperty); } set { SetValue(ActualWidthProperty, value); } } public static readonly DependencyProperty ActualWidthProperty = DependencyProperty.Register( "ActualWidth", typeof(double), typeof(WindowsElement), new PropertyMetadata((double)0, ActualWidthPropertyChanged)); public static void MessWithBindings() { WindowsElement we1 = new WindowsElement(); WindowsElement we2 = new WindowsElement(); var b = new Binding { Source = we2, Path = new PropertyPath("ActualWidth") }; BindingOperations.SetBinding(we1, WindowsElement.WidthProperty, b); we2.ActualWidth = 13; CommonDebug.LogLine(we1, we1.Width, we1.ActualWidth, we2, we2.Width, we2.ActualWidth); } }