2009-08-28 13 views
5

से अपडेट करना मेरे पास एक स्ट्रिंग निर्भरता प्रॉपर्टी (सर्चटेक्स्ट) है, जब अपडेट किया गया है, तो संग्रह निर्भरता संपत्ति (परिणाम) को अपडेट करने की आवश्यकता है।
मेरे संग्रह डी पी:एक निर्भरता प्रॉपर्टी को अन्य

public IEnumerable<string> Results{ 
    get { return (IEnumerable<string>) GetValue(ResultsProperty); } 
    set { SetValue(ResultsProperty, value); } 
} 
public static readonly DependencyProperty ResultsProperty= 
DependencyProperty.Register("Results", typeof(IEnumerable<string>), typeof(MainWindowVM), new UIPropertyMetadata(new List<string>())); 

मैं कोई भाग्य के साथ इस की कोशिश की। मैंने परिणाम = .... लाइन पर ब्रेकपॉइंट लगाया और यह कभी हिट नहीं हुआ।

public string SearchText{ 
    get { return (string) GetValue(SearchTextProperty); } 
    set { 
    Results = 
      from T in Tree.GetPeople(value) 
      select T.FullName; 
    SetValue(SearchTextProperty, value); 
    } 
} 
public static readonly DependencyProperty SearchTextProperty= 
DependencyProperty.Register("SearchText", typeof(string), typeof(MainWindowVM), new UIPropertyMetadata("")); 

XAML:

<TextBox DockPanel.Dock="Top" Text="{Binding SearchValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

<ListBox DockPanel.Dock="Top" ItemsSource="{Binding NameResults}" SelectedItem="{Binding Search}" />

उत्तर

7

जब XAML में या एक बाध्यकारी के माध्यम से एक निर्भरता संपत्ति की स्थापना, क्रम हमेशा उदाहरण संपत्ति उर्फ ​​और सीधे बायपास करेंगे फोन GetValue और SetValue । ऐसा इसलिए है कि आपका इंस्टेंस सेटटर नहीं लगाया जा रहा है।

आप जो करना चाहते हैं वह निर्भरता संपत्ति के साथ एक विधि पंजीकृत कर रहा है जिसे संपत्ति में परिवर्तन होने पर लागू किया जाएगा। निर्भरता संपत्ति के लिए PropertyMetadata बनाते समय यह आसानी से किया जाता है।

मुझे विश्वास है कि निम्नलिखित उदाहरण वह है जो आप करना चाहते हैं। उदाहरण में, मेरी कक्षा में दो डिमेंसी गुण हैं जो पहले और दूसरे के रूप में उपनाम हैं। जब मैं पहले के लिए मान निर्धारित करता हूं, तो मेरे परिवर्तन हैंडलर को बुलाया जाता है और मैंने दूसरा मान निर्धारित किया है।

public class DependencyPropertyTest : DependencyObject 
{ 
    public static readonly DependencyProperty FirstProperty; 
    public static readonly DependencyProperty SecondProperty; 

    static DependencyPropertyTest() 
    { 
    FirstProperty = DependencyProperty.Register("FirstProperty", 
                typeof(bool), 
                typeof(DependencyPropertyTest), 
                new PropertyMetadata(false, FirstPropertyChanged)); 

    SecondProperty = DependencyProperty.Register("SecondProperty", 
               typeof(string), 
               typeof(DependencyPropertyTest), 
               new PropertyMetadata(null)); 
    } // End constructor 

    private bool First 
    { 
    get { return (bool)this.GetValue(FirstProperty); } 
    set { this.SetValue(FirstProperty, value);  } 

    } // End property First 

    private string Second 
    { 
    get { return (string)this.GetValue(SecondProperty); } 
    set { this.SetValue(SecondProperty, value);   } 

    } // End property Second 

    private static void FirstPropertyChanged(DependencyObject dependencyObject, 
              DependencyPropertyChangedEventArgs ea) 
    { 
    DependencyPropertyTest instance = dependencyObject as DependencyPropertyTest; 

    if (instance == null) 
    { 
     return; 
    } 

    instance.Second = String.Format("First is {0}.", ((bool)ea.NewValue).ToString()); 

    } // End method FirstPropertyChanged 
} // End class DependencyPropertyTest 

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

-1, यह 'second' संपत्ति पर बाध्यकारी टूट जाएगा क्योंकि setValue SetCurrentValue के स्थान पर किया जाएगा (http://stackoverflow.com/ देखना प्रश्न/4230698/क्या-अंतर-बीच-निर्भरता-संपत्ति-setValue-setcurrentvalue)। – Benlitz

+3

आज सच है, मैं आपको दूंगा। हालांकि, उस समय यह उत्तर लिखा गया था, .NET Framework 3.5 सबसे वर्तमान संस्करण था जिसमें SetCurrentValue सदस्य नहीं था। (रेफरी: https://msdn.microsoft.com/en-us/library/system.windows.dependencyobject_members(v=vs.90).aspx) आधुनिकीकरण के लिए कोई टिप्पणी या अतिरिक्त उत्तर के लायक है, लेकिन IMHO यह एक डाउन वोट वारंट नहीं करता है। –

5

जैसा कि मैंने टिप्पणी की, वर्तमान में स्वीकृत उत्तर सिद्धांत में सही है, सिवाय इसके कि इसे सरल असाइनमेंट करने के बजाय SetCurrentValue विधि का उपयोग करना चाहिए। इसके बारे में अधिक स्पष्टीकरण के लिए this answer देखें।

यहाँ यह सुधार के साथ एक ही कोड है:

public class DependencyPropertyTest : DependencyObject 
{ 
    public static readonly DependencyProperty FirstProperty; 
    public static readonly DependencyProperty SecondProperty; 

    static DependencyPropertyTest() 
    { 
    FirstProperty = DependencyProperty.Register("FirstProperty", 
                typeof(bool), 
                typeof(DependencyPropertyTest), 
                new PropertyMetadata(false, FirstPropertyChanged)); 

    SecondProperty = DependencyProperty.Register("SecondProperty", 
               typeof(string), 
               typeof(DependencyPropertyTest), 
               new PropertyMetadata(null)); 
    } // End constructor 

    private bool First 
    { 
    get { return (bool)this.GetValue(FirstProperty); } 
    set { this.SetValue(FirstProperty, value);  } 

    } // End property First 

    private string Second 
    { 
    get { return (string)this.GetValue(SecondProperty); } 
    set { this.SetValue(SecondProperty, value);   } 

    } // End property Second 

    private static void FirstPropertyChanged(DependencyObject dependencyObject, 
              DependencyPropertyChangedEventArgs ea) 
    { 
    DependencyPropertyTest instance = dependencyObject as DependencyPropertyTest; 

    if (instance == null) 
    { 
     return; 
    } 

    // SetCurrentValue should be used here! 
    instance.SetCurrentValue(SecondProperty, 
     String.Format("First is {0}.", ((bool)ea.NewValue).ToString()); 

    } // End method FirstPropertyChanged 
} // End class DependencyPropertyTest 
+0

एक टिप्पणी होना चाहिए! –

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