2011-09-14 31 views
5

मैं अपने पुराने कोड के माध्यम से जा रहा था और एक हाइब्रिड IValueConverter/MarkupExtension कक्षा में आया था। मुझे आश्चर्य हुआ कि IServiceProviderProvideValue विधि में वास्तव में उपयोगी था, और यह कैसे उपयोगी होगा?MarkupExtension.ProvideValue - क्या IServiceProvider वास्तव में उपयोग किया जाता है?

मुझे लगता है कि IServiceProvider में केवल एक विधि है: GetService, जिसे उचित सेवा प्रकार में डाला जाना चाहिए। मैंने MarkupExtension.ProvideValue एमएसडीएन पृष्ठ पर भी देखा और यह विभिन्न प्रकार की सेवाओं की सूची देता है। मुझे लगता है, मैं बस सोच रहा हूं कि इनमें से कोई भी सेवा उपयोगी है या क्या मुझे अपनी विधि छोड़नी चाहिए?

वर्तमान विधि:

public Object ProvideValue(IServiceProvider serviceProvider) 
{ 
    return new MyConverter(); 
} 
मूल रूप से

, मैं निम्न करना चाहिए:

public Object ProvideValue(IServiceProvider serviceProvider) 
{ 
    var provider = serviceProvider as SomeType; 

    if (provider == null) return new MyConverter(); 

    //Do something with the provider here? 
} 

उत्तर

6

यदि आपका IServiceProvider के साथ किसी भी बातचीत neeeding बिना MarkupExtension काम करता है तो जाहिर है वहाँ कुछ भी नहीं पहुँचने से प्राप्त किया जा रहा है । सभी MarkupExtension/ValueConverter combos मैंने देखा है और खुद को भी लिखा है इस श्रेणी में भी आते हैं।

व्यावहारिक मामलों से आगे बढ़ना, यदि आप केवल सामग्री को पढ़ने की तलाश में हैं तो प्रदाता क्या सेवाएं प्रदान कर सकता है और वे उपयोगी कैसे हो सकते हैं here पर अधिक जानकारी है।

11

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

उदाहरण

public override object ProvideValue(IServiceProvider provider) 
{ 
    IProvideValueTarget service = (IProvideValueTarget)provider.GetService(typeof(IProvideValueTarget)); 
    DependencyObject targetObject = service.TargetObject as DependencyObject; 
    DependencyProperty targetProperty = service.TargetProperty as DependencyProperty; 

    // ... 
}