2012-05-14 15 views
6

簡単に言えば、WPFコントロールに2つの依存プロパティを作成し、各プロパティ変更通知にコードを入れて、他のプロパティを変更することができます(PropA変更セットPropBおよびPropB変更セットPropA)。依存関係のプロパティの再入力

私はこれが自分自身の背後に消えてしまうと思っていますが、WPFはそれをうまく処理しているようです。これは実際には私の目的にとっては非常に便利ですが、どこに文書化されているのかわかりません。

何が起こっているのですか? WPF依存関係プロパティは通知システムガードを再入可能状態に変更しますか?

代表のコードは次のとおりです。

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> 

コードの後ろに:プロパティを変更した場合、これらのコールバックは唯一解雇され

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

は、具体的な答えを持っていますが、あるとしていない:WPFを考慮すると、あまりにも要素のツリーに沿って再帰的な流れと関連するプロパティを作り、それだけで「節約します"(具体的なイベントの場合)ノードが既に通過して通知を発したので、もう一度会ったらそれらをスキップしてください。 – Tigran

答えて

3

、あなたのコードはありません無限ループを作成しない異なる値

はこれを試してみて、あなたはSOの例外が発生します:

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

私は名前の手掛かりがあると思います!私は、通知は、関係なく発射されると仮定していたが、私はちょうど簡単なテストを行ったし、これはまさに何が起こっているように見えます。 – MarcE

関連する問題