2010-12-03 16 views
8

मैं XAML में मनमानी सी # अभिव्यक्तियों का उपयोग करने में सक्षम होना चाहता हूं। आम तौर पर यह दो बाध्य मानों के आधार पर यूआई तत्व के लिए एक संपत्ति की गणना करना होगा।क्या एक्सएएमएल में मनमानी सी # अभिव्यक्तियों का उपयोग करने का कोई मौजूदा तरीका है?

उदाहरण के लिए दो अन्य गुणों के आधार पर यूआई तत्व की चौड़ाई की गणना करना।

यह मैं XAML की तरह लग रहे करना चाहते हैं की एक काल्पनिक उदाहरण है:

<TextBox 
    x:Name="textBox1" 
    /> 

<TextBox 
    x:Name="textBox2" 
    /> 

<Rectangle 
    Height={Double.Parse(textBox1.Text) + Double.Parse(textBox2.Text)} 
    /> 

बेशक वहाँ XAML में ऐसा करने का कोई अंतर्निहित तरीका है।

मुझे पता है कि मैं एक कस्टम कनवर्टर के साथ संयुक्त मल्टीबाइंडिंग का उपयोग कर सकता हूं और यह आमतौर पर मैं इस तरह की चीज करता हूं। हालांकि मुझे ऐसा लगता है कि एक्सएएमएल में कुछ सी # कोड शामिल करना इतना आसान होगा और मैं सोच रहा था कि अगर कोई भी इस समस्या को एक्सएएमएल एक्सटेंशन या कुछ और हल कर चुका है।

+2

कोई भी आपके काम को बनाए रखने के लिए शर्त लगाता है। –

+0

यदि एक्सएएमएल कंपाइलर वास्तव में इसका समर्थन करता है तो इन एक्सएएमएल फाइलों को बनाए रखना बहुत आसान होगा! ऐसा इसलिए है क्योंकि आपको काम करने के लिए कनवर्टर कक्षाओं के भार का निर्माण नहीं करना पड़ेगा और कम वर्गों का मतलब कम रखरखाव है। –

+1

हां, ऐसा हो सकता है, लेकिन यह प्रस्तुति को व्यावसायिक तर्क से अलग करने की वस्तु को हरा देता है, जिसका अर्थ है अधिक रखरखाव। और, गैर मानक उपयोग, भ्रम की वजह से। –

उत्तर

2

आप XAML में सी # कोड एम्बेड कर इस तरह:

<x:Code> 
      <![CDATA[ 

      void ButtonOnClick(object sender, RoutedEventArgs args) 
      { 
       Button btn = sender as Button; 
       MessageBox.Show("The button labeled '" + 
           btn.Content + 
           "' has been clicked.","Information Message"); 
      } 
      ]]> 
    </x:Code> 

लेकिन इस दृष्टिकोण सभी क्योंकि यह व्यापार तर्क के साथ शुद्ध प्रस्तुति परत घुलमिल पर अनुशंसित नहीं है।

+0

उत्तर के लिए धन्यवाद, लेकिन वास्तव में यह नहीं है कि मैं क्या कर रहा हूं। मैं अपने स्वयं के कन्वर्टर्स बनाने और मल्टीबाइंडिंग का उपयोग करने से बचने के लिए मुख्य रूप से यूआई तत्वों के गुणों को सेट करने के लिए सी # का उपयोग करना चाहता हूं। –

+0

आप कन्वर्टर्स और मल्टीबाइंडिंग का उपयोग क्यों करना चाहते हैं? वे सुविधा हैं। –

+0

अभिव्यक्ति टाइप करने से एक नई कक्षा को और अधिक सुविधाजनक बनाने का तरीका क्या है? –

2

मैंने कस्टम Xaml कनवर्टर्स को देखा है जो आयरनपीथन कोड लेते हैं और डीएलआर को आमंत्रित करते हैं। यह काफी सी # नहीं है, लेकिन यह निश्चित रूप से [सीडीएटीए] टैग का उपयोग करने के दृष्टिकोण से कम बदसूरत है।

http://pybinding.codeplex.com/

इस मामले पर एक ओपन सोर्स प्रोजेक्ट के लिए लिंक है।

+0

दिलचस्प लगता है। मुझे पता है कि मैं इन कन्वर्टर्स कहां पा सकता हूं? –

+0

लिंक के लिए धन्यवाद। यह मेरी इच्छा के करीब दिखता है। –

+0

आप मोनो के कंपाइलर को सेवा के रूप में उपयोग करने के दृष्टिकोण को अनुकूलित करने का भी प्रयास कर सकते हैं। बेशक मुझे नहीं पता कि यह कितना काम करेगा। –

1

कृपया ध्यान रखें कि

Height={Double.Parse(textBox1.Text) + Double.Parse(textBox2.Text)} 

की तरह कोड के साथ (है, हालांकि पूरी तरह से असंभव नहीं मन में Linq भाव रखते हुए) विशेष रूप से मुश्किल है जैसे ही ऑपरेंड के कुछ बदलने के रूप में पुनः मूल्यांकन मूल्य मिलता है। जब स्रोत परिवर्तन होता है तो लक्ष्य मान का स्वचालित अपडेट WPF बाइंडिंग के प्रमुख फायदों में से एक है।

+0

मैं नाटक करने की कोशिश नहीं कर रहा था कि वैध एक्सएएमएल था! सिद्धांत रूप में अभिव्यक्ति को पुनः मूल्यांकन करने के लिए यह बहुत कठिन नहीं होना चाहिए। यदि एक्सएएमएल कंपाइलर वास्तव में उस अभिव्यक्ति को संसाधित कर सकता है तो यह पता चलेगा कि 'textBox1.Text' और 'textBox2.Text' निर्भरता गुण हैं और इसलिए यह पता चलेगा कि जब वे इसे बदलते हैं तो अभिव्यक्ति का पुनर्मूल्यांकन करना होता है। –

+1

@ एशले: न तो मैंने किया। इसे ध्यान में रखते हुए, कहा गया कार्यक्षमता लागू करने का एकमात्र तरीका मार्कअप एक्सटेंशन का उपयोग करेगा। कहा गया विस्तार linq अभिव्यक्ति बनाने के लिए काफी मुश्किल हो सकता है, सभी ऑपरेटरों प्रकारों की जांच, और एक उपयुक्त multibinding का निर्माण। – Vlad

+0

यह एक दिलचस्प दृष्टिकोण की तरह लगता है। मैं इसे कभी-कभी देख सकता हूं (अगर किसी ने मुझे पहले ही जवाब नहीं दिया है;) –

1

अपनी अभिव्यक्ति को सार्वजनिक संपत्ति में लपेटें और उस संपत्ति से जुड़ें।

सी # codebehind में:

public double Heigth 
{ 
    get { return Double.Parse(textBox1.Text) + Double.Parse(textBox2.Text); } 
} 

XAML में:

<Rectangle Height={Binding Heigth} /> 
+0

वास्तव में सुविधाजनक नहीं है। एक कनवर्टर बनाने और मल्टीबाइंडिंग का उपयोग करना संभवतः एक नई निर्भरता संपत्ति बनाने के लिए आसान होगा, और उसके बाद अभिव्यक्ति के मान को दोबारा बदलने के लिए मेरे उदाहरण में दो टेक्स्ट बॉक्स के लिए बदले गए ईवेंट को संभालें। –

+0

उदाहरण के लिए धन्यवाद, लेकिन जब भी textBox1.Text और textBox2.Text बदल गया है, तो आप "ऊंचाई" के लिए 'PropertyChanged' को कॉल करते हुए कोड खो रहे हैं। यदि आप ऐसा नहीं करते हैं तो यूआई सही ढंग से अपडेट नहीं कर पाएगा। –

+0

@ एशले डेविस: आप सही हैं। इसमें कोई अपवाद हैंडलिंग भी अनुपलब्ध है और उपयोगकर्ता को सही मान इनपुट करने के लिए निर्भर करता है, जो कभी भी एक अच्छा विचार नहीं है। – VVS

0

अब मैं अपने प्रश्न का उत्तर है। यह वह जवाब नहीं है जिसे मैं मूल रूप से ढूंढ रहा था, और यह थोड़ा लंबा हवादार है लेकिन यह काम करता है।

मैं जोश स्मिथ द्वारा इस पोस्ट को पढ़ रहा था। उन्होंने कहा कि मूल्य कन्वर्टर्स का उपयोग नहीं की सिफारिश लेकिन गणना व्यू-मॉडल में नीचे धक्का और एक संपत्ति के रूप में यह उजागर:

http://groups.google.com/group/wpf-disciples/browse_thread/thread/3fe270cd107f184f?pli=1

मेरे मामले में दोनों 'textBox1' और 'TextBox2' के लिए पाठ में बाध्य किया जाना चाहिए व्यू-मॉडल, इसलिए जब वे दृश्य-मॉडल में बदलते हैं तो मुझे गणना करने और निर्भर संपत्ति को अपडेट करने का समय पता होता है।आश्रित संपत्ति तब संपत्ति को बदलती है और उसमें यूआई अपडेट बदल जाती है।

आप एक मामले में जहां आप केवल पढ़ने के नियंत्रण गुणों पर निर्भर है कि आप आसानी से दृश्य-मॉडल करने के लिए बाध्य नहीं कर सकता अभिव्यक्ति बनाना चाहते है, तो आप का अनुसरण कर सकते सलाह यहाँ प्रस्तुत:

Pushing read-only GUI properties back into ViewModel

मैं अभी भी XAML में एम्बेड (गैर-व्यावसायिक तर्क) अभिव्यक्तियों की क्षमता रखना चाहता हूं। लेकिन यह देखते हुए कि यह नहीं बनाया गया है-ऐसा करने का कोई भी तरीका हैक का थोड़ा सा होने की संभावना है। व्यू-मॉडल के माध्यम से जाना ऐसा करने का सही तरीका प्रतीत होता है, लेकिन शायद एक दिन मैं एक मार्कअप एक्सटेंशन लिखने के साथ प्रयोग करूंगा जो एक्सएएमएल में अभिव्यक्ति की अनुमति देता है।

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

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