2012-05-14 2 views
6

간단히 말해서 WPF 컨트롤에서 2 개의 종속성 속성을 만들고 다른 속성을 변경하기 위해 각 속성 변경 알림에 코드를 넣을 수 있습니다 (예 : PropA 변경 집합 PropBPropB 변경 집합 PropA).종속성 속성 재 입력 (또는 왜 작동합니까?)

나는 이것이 자신의 뒷면을 없애기를 기대하지만, WPF는 훌륭하게 처리하는 것으로 보인다. 그것은 실제로 내 목적에 매우 편리하지만 어디서나이 동작을 찾을 수는 없습니다.

무슨 일 이니? WPF 종속성 속성이 알림 시스템 가드를 reentrancy에 대해 변경합니까?

대표 코드는 다음과 같습니다

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

구체적인 대답을 가지고 있지만 있다고 가정하지 않는

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를 고려하는 요소의 트리를 따라 순환 흐름과도 관련 속성을, 그냥 "저장을 "(구체적인 이벤트의 경우) 이미 노드를 통과하고 알림을 시작한 노드이므로 다시 한 번 만나면 건너 뜁니다. – Tigran

답변

3

, 코드가 않습니다 무한 루프를 만들지 마라. 다른 값.

이 시도하고 당신은 SO 예외 얻을 것이다 :

이 가 이
+0

실마리가 그 이름에있는 것 같아요! 나는 그 통보가 관계없이 해고 될 것이라고 추측하고 있었지만, 나는 단지 빠른 테스트를 마쳤으며 이것이 정확히 일어나고있는 것으로 보인다. – MarcE