2010-08-26 15 views
13

यदि मेरे पास ऑब्जेक्ट कहलाता है जिसे MyObject कहा जाता है, जिसमें MyChild नामक एक संपत्ति है, जिसका नाम नाम नामक एक संपत्ति है। मैं उस नाम संपत्ति का मूल्य कैसे प्राप्त कर सकता हूं यदि मेरे पास बाध्यकारी पथ है (यानी "MyChild.Name"), और MyObject का संदर्भ?डब्ल्यूपीएफ - बाध्यकारी पथ से संपत्ति मूल्य प्राप्त करना

MyObject 
    -MyChild 
    -Name 
+0

आप कैसे आप इस का उपयोग करना चाहते का एक उदाहरण प्रदान कर सकते हैं ? – Rachel

उत्तर

19

मुझे एक रास्ता मिला ऐसा करने के लिए, लेकिन यह काफी बदसूरत है और शायद बहुत तेज़ नहीं है ... असल में, विचार दिया गया पथ के साथ बाध्यकारी बनाना और निर्भरता वस्तु की संपत्ति पर लागू करना है। इस तरह से, बंधन मूल्य पुन: प्राप्त करने का सब काम करता:

public static class PropertyPathHelper 
{ 
    public static object GetValue(object obj, string propertyPath) 
    { 
     Binding binding = new Binding(propertyPath); 
     binding.Mode = BindingMode.OneTime; 
     binding.Source = obj; 
     BindingOperations.SetBinding(_dummy, Dummy.ValueProperty, binding); 
     return _dummy.GetValue(Dummy.ValueProperty); 
    } 

    private static readonly Dummy _dummy = new Dummy(); 

    private class Dummy : DependencyObject 
    { 
     public static readonly DependencyProperty ValueProperty = 
      DependencyProperty.Register("Value", typeof(object), typeof(Dummy), new UIPropertyMetadata(null)); 
    } 
} 
+0

यह बाध्यकारी के मूल्य को प्राप्त करने के लिए बहुत सारी मशीनरी की तरह लगता है लेकिन मैं एक बेहतर सामान्य उद्देश्य कोड समाधान के बारे में नहीं सोच सकता। +1 और चीयर्स। – Berryl

+0

उत्कृष्ट, धन्यवाद थॉमस! मुझे ऐसा कुछ कारण चाहिए क्योंकि मैंने छवियों को लोड करने के लिए कस्टम मार्कअप एक्सटेंशन लिखा है। इस एक्सटेंशन में छवि नाम के लिए नाम संपत्ति है, जिसे मैं अब डेटा टेम्पलेट में मॉडल प्रॉपर्टी से जोड़ना चाहता हूं जो मार्कअप एक्सटेंशन का उपयोग करता है। हालांकि, मैं बांध नहीं सकता क्योंकि नाम डीपी नहीं है, न ही यह हो सकता है :(यह एकमात्र समाधान था जिसे मैं सोच सकता था, इसलिए मैं इस कोड को आज़मा दूंगा। धन्यवाद। – devdigital

+0

यह मेरी आवश्यकताओं के लिए पूरी तरह से काम करता है (एक बाध्यकारी पथ दिए गए दृश्य मॉडल की संपत्ति के मूल्य को प्राप्त करना और सेट करना)। क्या संपत्ति के _type_ को प्राप्त करने का एक समान तरीका है जो किसी बाध्यकारी पथ से बंधेगा? – lesscode

0

नहीं यकीन है कि क्या आप लेकिन और कैसे (XAML या कोड) करना चाहते हैं अभी तक आप हमेशा अपने वस्तु नाम

<MyObject x:Name="myBindingObject" ... /> 

एक तो यह कोड में उपयोग कर सकते हैं

myBindingObject.Something.Name 

या xaml

<BeginStoryboard> 
<Storyboard> 
    <DoubleAnimation 
     Storyboard.TargetName="myBindingObject" 
     Storyboard.TargetProperty="Background" 
     To="AA2343434" Duration="0:0:2" > 
    </DoubleAnimation> 
</Storyboard> 
</BeginStoryboard> 
3

मैं एक nuget packagePather.CSharp विकसित करता है कि आप वास्तव में क्या जरूरत है।

इसमें कक्षा Resolver है जिसमें Resolve विधि है जो @ थॉमसलेवेस्क की GetValue विधि जैसी व्यवहार करती है।
उदाहरण:

IResolver resolver = new Resolver(); 
var o = new { Property1 = Property2 = "value" } }; 
var path = "Property1.Property2";  
object result = r.Resolve(o, path); //the result is the string "value" 

यह भी सूचकांक या कुंजी के माध्यम से शब्दकोश पहुँच के माध्यम से संग्रह पहुँच का समर्थन करता है।
इन के लिए उदाहरण रास्ते हैं:

"ArrayProperty[5]" 
"DictionaryProperty[Key]" 
+0

क्या यह स्पष्ट रूप से कार्यान्वित इंटरफ़ेस गुणों और छिपी हुई संपत्तियों तक पहुंच का समर्थन करता है? – Grx70

+0

@ Grx70 हां। यह प्रतिबिंब के माध्यम से काम करता है, इसलिए यदि वस्तु वस्तु पर मौजूद है और सार्वजनिक है, तो इसका मूल्य प्राप्त होगा। – Domysee

0

मैं इसे इस तरह से कर रहा हूँ। कृपया मुझे पता है कि अगर यह एक भयानक विचार है, जैसे कि सी # मेरे लिए सिर्फ एक पक्ष काम है तो मैं एक विशेषज्ञ objectToAddTo प्रकार ItemsControl की है नहीं कर रहा हूँ:

BindingExpression itemsSourceExpression = GetaBindingExression(objectToAddTo); 
object itemsSourceObject = (object)itemsSourceExpression.ResolvedSource; 
string itemSourceProperty = itemsSourceExpression.ResolvedSourcePropertyName; 

object propertyValue = itemsSourceObject.GetType().GetProperty(itemSourceProperty).GetGetMethod().Invoke(itemsSourceObject, null); // Get the value of the property 
संबंधित मुद्दे