2012-05-14 18 views
6

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"; 
     } 
    } 
+0

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

Respuesta

3

Esas devoluciones de llamada solamente se encienden si la propiedad cambió, su código hace no crear un bucle infinito de valores diferentes.

Prueba esto y obtendrá un SO excepción:

private static readonly Random _random = new Random(); 
private static void PropBChanged(DependencyObject lDependencyObject, DependencyPropertyChangedEventArgs lDependencyPropertyChangedEventArgs) 
{ 
    ((MainWindow)lDependencyObject).PropA = _random.Next().ToString(); 
} 
private static void PropAChanged(DependencyObject lDependencyObject, DependencyPropertyChangedEventArgs lDependencyPropertyChangedEventArgs) 
{ 
    ((MainWindow)lDependencyObject).PropB = _random.Next().ToString(); 
} 
+0

¡Creo que la pista está en el nombre! Estaba asumiendo que la notificación se lanzaría independientemente, pero acabo de hacer una prueba rápida y parece que esto es exactamente lo que está sucediendo. – MarcE

Cuestiones relacionadas