2012-05-14 17 views
6

Basitçe, bir WPF denetiminde 2 bağımlılık özelliği oluşturabilir ve her özelliğin kodunu değiştirmek için bildirimi değiştirerek diğer özelliği değiştirebilirim (örneğin PropA değişiklik kümeleri PropB ve PropB set değiştir PropA).Bağımlılık özelliği yeniden entrancy (veya: neden bu işe yarar?)

Bunun kendi arka tarafına kaymasını beklerdim, ancak WPF onu iyi bir şekilde ele alıyor gibi görünüyor. Bu aslında benim amacım için çok kullanışlıdır, ancak bu davranışı her yerde belgeleyemiyorum.

Peki neler oluyor? WPF bağımlılık özelliği bildirim sistemi korumasını reentraniteye karşı değiştiriyor mu?

Temsilcisi kod aşağıda:

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> 

Kod arkasında: özellik değişirse olanlar geri aramalar sadece ateş edilir

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

beton cevabı, ama bu sanmıyorum

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(); } 
: WPF dikkate elementin ağacı boyunca özyinelemeli akış ve çok ilişkili özelliklerini yapmak, sadece "kaydeder "(somut olay için) hangi düğümleri zaten geçirdi ve bildirimi başlattı, bu yüzden tekrar başka bir zamanla karşılaşırsanız onları atlayın. – Tigran

cevap

3

, kodunuz yapar sonsuz bir döngü oluşturmaz farklı değerler.

bu deneyin ve bir SO istisna alacak:

+0

Sanırım ipucu isimde! Bildirimin ne olursa olsun kovulacağını varsayıyordum, ancak hızlı bir test yaptım ve bunun tam olarak ne olduğu ortaya çıkıyor. – MarcE

İlgili konular