En pocas palabras, puedo crear 2 propiedades de dependencia en un control WPF y poner código en cada notificación de cambio de propiedad para cambiar la otra propiedad (es decir, PropA
cambian conjuntos PropB
y PropB
change sets PropA
).Reentrada de propiedad de dependencia (o: ¿por qué funciona esto?)
Me gustaría que esto desaparezca por su propia parte trasera, pero parece que WPF lo maneja muy bien. Eso es realmente muy útil para mis propósitos, pero no puedo encontrar este comportamiento documentado en ninguna parte.
¿Qué está pasando? ¿La propiedad de dependencia de WPF cambia el sistema de notificación de protección contra la reentrada?
código representativo sigue:
XAML:
<Window x:Class="WPFReentrancy1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox Text="{Binding PropB, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Window>
Código atrás:
public partial class MainWindow : Window
{
public string PropA
{
get { return (string)GetValue(PropAProperty); }
set { SetValue(PropAProperty, value); }
}
public static readonly DependencyProperty PropAProperty =
DependencyProperty.Register("PropA", typeof (string), typeof (MainWindow),new UIPropertyMetadata("0", PropAChanged));
public string PropB
{
get { return (string)GetValue(PropBProperty); }
set { SetValue(PropBProperty, value); }
}
public static readonly DependencyProperty PropBProperty =
DependencyProperty.Register("PropB", typeof (string), typeof (MainWindow), new UIPropertyMetadata("", PropBChanged));
private static void PropBChanged(DependencyObject lDependencyObject, DependencyPropertyChangedEventArgs lDependencyPropertyChangedEventArgs)
{
((MainWindow) lDependencyObject).PropA = (string) lDependencyPropertyChangedEventArgs.NewValue;
}
private static void PropAChanged(DependencyObject lDependencyObject, DependencyPropertyChangedEventArgs lDependencyPropertyChangedEventArgs)
{
((MainWindow) lDependencyObject).PropB =
double.Parse((string) lDependencyPropertyChangedEventArgs.NewValue).ToString("0.000");
}
public MainWindow()
{
InitializeComponent();
DataContext = this;
PropA = "1.123";
}
}
no tienen respuesta concreta, pero suponer que: teniendo en cuenta la WPF hacen flujo recurrente a lo largo del árbol del elemento y las propiedades asociadas también, sólo "ahorra "(para eventos concretos) qué nodos ya ha pasado y disparado la notificación, así que sáltelos si los volvía a encontrar otra vez. – Tigran