2012-04-26 18 views
5

मैं एक कस्टम मार्कअप एक्सटेंशन पर काम कर रहा हूं जिसमें मुझे XAML से नई ऑब्जेक्ट बनाने के लिए एक गैर स्ट्रिंग पैरामीटर की आवश्यकता है। क्या डाटाकॉन्टेक्स्ट स्कोप में किसी फ़ील्ड पर बाध्यकारी गैर-स्ट्रिंग पैरामीटर का उपयोग करना संभव है?बाइंडिंग पैरामीटर के साथ मार्कअप एक्सटेंशन

दूसरे शब्दों में, मैं ऐसा कुछ कैसे कर सकता हूं?

<ListBox ItemsSource="{Binding Source={local:MyMarkupExtension {x:Type Button},IncludeMethods={Binding Source=CustomerObject.IsProblematic}}}" /> 

जहां IncludeMethods=CustomerObject.IsProblematic मुझे इस त्रुटि दे: बंधन प्रकार 'TypeDescriptorExtension' के 'IncludeMethods' संपत्ति पर सेट नहीं किया जा सकता है। एक 'बाध्यकारी' केवल निर्भरता ऑब्जेक्ट की निर्भरता प्रॉपर्टी पर सेट किया जा सकता है।

क्या कोई मेरी मदद कर सकता है?

धन्यवाद

उत्तर

9

ए 'बंधन' केवल एक DependencyObject की एक DependencyProperty पर सेट किया जा सकता है - यह सच है। समस्या यह है कि MarkupExtension कक्षा DependencyObject से प्राप्त नहीं होती है, इसलिए इसकी संपत्तियों पर बाध्यकारी सेट करना संभव नहीं है।

[संपादित करें]

वर्कअराउंड ValueConverters उपयोग कर रहा है। एक और कामकाज कई विरासतों को अनुमति देने के लिए सी # भाषा को बदलना है। वैसे, सिल्वरलाइट MarkupExtension में IMarkupExtension इंटरफ़ेस लागू करता है, इसलिए मैंने इसे अपने कस्टम एक्सटेंशन में कार्यान्वित करने की कोशिश की और इसे DependecyObject से प्राप्त किया, DependencyProperty जोड़ा और इसमें बाध्यकारी सेट किया। यह क्रैश नहीं होता है, लेकिन बाध्यकारी वास्तव में प्रदान करता है ProvalValue() कहा जाता है। तो सिल्वरलाइट में भी कोई समाधान नहीं है (या यह मुश्किल है - Klaus78's answer में प्रदान किया गया लिंक देखें)। WPF MarkupExtension में किसी भी इंटरफ़ेस को लागू नहीं किया जाता है, इसलिए आप इसके गुणों से बंध नहीं सकते हैं।

+0

किसी को भी मुझे एक समाधान का सुझाव कर सकते हैं? – user1351709

+0

कृपया मेरे संपादन को देखें – EvAlex

+17

एकाधिक विरासत को अनुमति देने के लिए सी # भाषा को बदलना बिल्कुल ठीक नहीं है;) –

0

यह लिंक क्योंकि WPF MarkupExtension में IMarkupExtension इंटरफ़ेस को लागू नहीं करता है, किसी

के बारे में

Custom Markup Extension with bindable properties

संपादित मुझे ध्यान दें कि इस सिल्वरलाइट के लिए ही काम करता है बनाने के जानकारीपूर्ण है। (धन्यवाद EvAlex)

+0

यह केवल सिल्वरलाइट के लिए काम करता है, क्योंकि डब्ल्यूपीएफ मार्कअप एक्सटेंशन में IMarkupExtension इंटरफ़ेस – EvAlex

-1

मुझे इस समस्या के लिए एक समाधान मिला।
मुख्य विचार बाध्यकारी की आवश्यकता वाले प्रत्येक पैरामीटर के लिए संलग्न संपत्ति को परिभाषित करना है।

public class MarkupExtensionWithBindableParam : MarkupExtension 
{ 
    public BindingBase Param1 { get; set; } // its necessary to set parameter type as BindingBase to avoid exception that binding can't be used with non DependencyProperty 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     IProvideValueTarget target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; 
     DependencyObject targetObject; 
     DependencyProperty targetProperty; 

     if (target != null && target.TargetObject is DependencyObject && target.TargetProperty is DependencyProperty) 
     { 
      targetObject = (DependencyObject)target.TargetObject; 
      targetProperty = (DependencyProperty)target.TargetProperty; 
     } 
     else 
     { 
      return this; // magic 
     } 

     // Bind the Param1 to attached property Param1BindingSinkProperty 
     BindingOperations.SetBinding(targetObject, MarkupExtensionWithBindableParam.Param1BindingSinkProperty, Param1); 

     // Now you can use Param1 

     // Param1 direct access example: 
     object param1Value = targetObject.GetValue(Param1BindingSinkProperty); 

     // Param1 use in binding example: 
     var param1InnerBinding = new Binding() { Source = targetObject, Path = new PropertyPath("(0).SomeInnerProperty", Param1BindingSinkProperty) }); // binding to Param1.SomeInnerProperty 
     return param1InnerBinding.ProvideValue(serviceProvider); // return binding to Param1.SomeInnerProperty 
    } 

    private static DependencyProperty Param1BindingSinkProperty = DependencyProperty.RegisterAttached("Param1BindingSink", typeof(object)// set the desired type of Param1 for at least runtime type safety check 
         , typeof(MarkupExtensionWithBindableParam), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits)); 
} 

प्रयोग सीधा है:

<TextBlock Text={local:MarkupExtensionWithBindableParam Param1={Binding Path="SomePathToParam1"}}/> 
+0

लागू नहीं होता है * उपयोग * उदाहरण के साथ कोई समस्या है। क्या मार्कअप उद्धरण में नहीं होना चाहिए? – OmegaMan

+1

काम नहीं कर रहा है; param1Value हमेशा शून्य है – esskar

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