2012-05-14 18 views
6

बस रखो, मैं एक WPF नियंत्रण में 2 निर्भरता गुण बना सकता हूं और अन्य संपत्ति को बदलने के लिए प्रत्येक संपत्ति परिवर्तन अधिसूचना में कोड डाल सकता हूं (यानी PropA परिवर्तन सेट PropB और PropB परिवर्तन सेट PropA)।निर्भरता संपत्ति पुन: प्रवेश (या: यह क्यों काम करता है?)

मैं उम्मीद करता हूं कि यह अपने पीछे की ओर गायब हो जाए लेकिन डब्ल्यूपीएफ इसे अच्छी तरह से संभालने लगता है। यह वास्तव में मेरे उद्देश्यों के लिए बहुत आसान है लेकिन मुझे यह व्यवहार कहीं भी दस्तावेज नहीं मिला है।

तो क्या चल रहा है? क्या डब्ल्यूपीएफ निर्भरता संपत्ति पुनर्वितरण के खिलाफ अधिसूचना प्रणाली गार्ड बदलती है?

प्रतिनिधि कोड इस प्रकार है:

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

उन कॉलबैक ही अगर संपत्ति बदल निकाल दिया जाता है, अपने कोड करता है एक अनंत पाश नहीं बनाओ विभिन्न मान

इस कोशिश करो और आप एक बहुत अपवाद मिल जाएगा:

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

संबंधित मुद्दे