2009-07-21 10 views
5

मेरे पास DataTemplate है कि मैं GridViewColumn के लिए CellTemplate के रूप में उपयोग कर रहा हूं।डब्ल्यूपीएफ मुझे बाध्यकारी के रास्ते पर बाध्यकारी नहीं होने देगा - क्या कोई और तरीका है?

मैं DataTemplate के लिए कुछ इस तरह लिखना चाहते हैं:

<DataTemplate 
    x:Key="_myTemplate"> 
    <TextBlock 
     Text="{Binding Path={Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}, Path=Header}}" /> 
</DataTemplate> 

मेरे GridView एक DataTable के लिए बाध्य है, और मैं DataTable जिसका नाम के स्तंभ के लिए बाध्य करना चाहते हैं हैडर के बराबर है GridViewColumnDataTemplate से जुड़ा हुआ है। [मुझे उम्मीद है कि समझ में आया!]

दुर्भाग्यवश, यह काम नहीं करता है। मुझे XamlParseException मिलता है: "ए 'बाध्यकारी' प्रकार 'बाध्यकारी' प्रकार की 'पथ' प्रॉपर्टी पर सेट नहीं किया जा सकता है। 'बाइंडिंग' केवल निर्भरता ऑब्जेक्ट की निर्भरता प्रॉपर्टी पर सेट की जा सकती है।"

मैं इसे कैसे सेट अप कर सकता हूं?

संपादित (सवाल का Danm द्वारा टिप्पणी को ऊपर उठाने)

मैं मूल रूप से जरूरत है एक DataTemplate जिसका बाध्यकारी DataContext और जो स्तंभ DataTemplate से जुड़ा हुआ है से निर्धारित होता है। क्या कोई विकल्प है?

+0

सुनिश्चित नहीं हैं कि आप इस के रूप में Silverlight RelativeSource टैग किया है Silverlight – AnthonyWJones

+0

, उस के बारे में एंथोनी क्षमा में समर्थित नहीं है। मुझे पता नहीं था कि चांदी की रोशनी रिलेटिवसोर्स का समर्थन नहीं करती थी। मेरा रिश्तेदार स्रोत का उपयोग करने के लिए विवाहित नहीं है, हालांकि, अगर मेरे प्रश्न के लिए एक एक्सएएमएल समाधान है जो इसका उपयोग नहीं करता है, तो भी मुझे इसे सुनने में दिलचस्पी होगी। – devuxer

उत्तर

0

आप किसी भी संपत्ति के लिए बाध्यकारी असाइन नहीं कर सकते हैं। संपत्ति को Binding के प्रकार या ऑब्जेक्ट पर निर्भरता संपत्ति के रूप में लागू किया जाना चाहिए।

Path बाध्यकारी वर्ग की संपत्ति PropertyPath प्रकार है और बाइंडिंग पथ संपत्ति को निर्भरता संपत्ति के रूप में लागू नहीं करती है। इसलिए आप जिस तरीके से प्रयास कर रहे हैं उसमें पथ को गतिशील रूप से बांध नहीं सकते हैं।

संपादित

आप मूल रूप से अपने बाध्य डेटा जो DataTemplate के विन्यास ड्राइव में मेटाडाटा एम्बेड करना चाहते हैं। यह अकेले एक्सएएमएल में नहीं किया जा सकता है। आपको कोड से कम से कम कुछ समर्थन की आवश्यकता होगी।

ऐसा लगता है कि सबसे अच्छा तरीका व्यूमोडेल का उपयोग करना होगा। इससे एक्सएएमएल में सीधे बाध्यकारी हो जाता है और व्यूमोडेल के कोड में निर्णय लेने के लिए "क्या बाध्य करना है" को धक्का देता है।

+0

धन्यवाद, लेकिन मेरा सवाल यह है कि XAML का उपयोग करके अपना लक्ष्य पूरा करने का दूसरा तरीका है या नहीं। मुझे मूल रूप से डेटा टेम्पलेट की आवश्यकता होती है जिसका बाध्यकारी डेटाकॉन्टेक्स्ट * द्वारा निर्धारित किया जाता है और * डेटा टेम्पलेट किस कॉलम से जुड़ा हुआ है। क्या कोई विकल्प है? आपके संपादन के लिए – devuxer

+0

@ एंथनी, थक्स। मेरा प्रश्न वास्तव में एक ग्रिड व्यू में पिवट डेटा दिखाने के तरीके पर चर्चा से बाहर आया जहां स्तंभों और संबंधित बाध्यकारी पथों की संख्या तब तक ज्ञात नहीं है जब तक कि डेटाबेस रनटाइम पर पूछताछ न हो जाए। मैं एमवीवीएम का उपयोग कर रहा हूं और एक व्यूमोडेल है, लेकिन मेरा प्रारंभिक समाधान XamlReader.Load() का उपयोग करके कोडबेंड में गतिशील रूप से डेटा टेम्पलेट जेनरेट करना था। इसे "अच्छा नहीं" के रूप में अत्यधिक आलोचना की गई थी (http: // stackoverflow देखें।कॉम/प्रश्न/1156336/यह-संभव-से-कॉन्फ़िगर-ए-ग्रिडव्यू-टू-शो-पिवोट-डेटा-उपयोग-स्थैतिक-एक्सएएमएल-अगर) है, इसलिए मेरा प्रयास अधिक लचीला डेटा टेम्पलेट पर है। – devuxer

+1

@ एनोथनी (जारी), तो मेरा डेटाकॉन्टेक्स्ट मेरे व्यूमोडेल पर सेट है, और मेरा ग्रिड व्यू का आइटमसोर्स व्यूमोडेल (डेटाटेबल) की एक संपत्ति पर सेट है, लेकिन मुझे लगता है कि मुझे समझ में नहीं आता कि व्यूमोडेल कैसे समस्या को हल कर सकता है प्रत्येक GridViewColumn को गतिशील रूप से लोड XAML का उपयोग किए बिना सही डेटाटेबल कॉलम पर मैप करने के लिए। – devuxer

0

क्या आप इसे अभी नहीं चाहते हैं?

{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}} 
+0

मुझे विश्वास है कि आपके पास यहां क्या है, कॉलम में प्रत्येक एकल कक्ष का टेक्स्ट बॉक्स हेडर के समान ही होगा। मैं चाहता हूं कि ग्रिड व्यू कॉलम को डेटाटेबल के उचित डेटा कॉलम में बांधना है, जहां डेटाटेबल में कॉलम के नाम ग्रिड व्यू कॉलम के शीर्षलेख मान से मेल खाते हैं। इसलिए, यदि ग्रिड व्यू कॉलम के लिए हेडर "कॉलम 3" थे, तो यह कॉलम डेटाटेबल में "कॉलम 3" नामक कॉलम से जुड़ा होगा। मुझे आशा है कि यह समझ में आता है :) – devuxer

+0

मुझे लगता है कि आप जिस तरह से कोशिश कर रहे हैं, उसे करने में आपको समस्याएं हो सकती हैं क्योंकि ग्रिड व्यू पंक्ति-आधारित हैं, यानी एक सेल एक बच्चा या पंक्ति है, कॉलम नहीं। डॉ। डब्ल्यूपीएफ द्वारा पोस्ट की इस श्रृंखला को देखने का प्रयास करें, यह कुछ भ्रम को दूर करने में मदद कर सकता है: http://drwpf.com/blog/ItemsControlSeries/tabid/59/Default.aspx। डब्ल्यूपीएफ के लिए अंगूठे का मूल नियम, यदि आप किसी चीज का उपयोग करने की कोशिश कर रहे हैं, तो इसे चीजों के लिए डिज़ाइन नहीं किया गया है, यह अविश्वसनीय रूप से कठिन हो जाएगा, लेकिन आमतौर पर इसे पहले से ही करने का एक आसान तरीका होता है। यह आसान तरीका ढूंढ रहा है कि कठिन हिस्सा है ... –

+0

@ ब्रायन मैं एक नज़र डालेगा, धन्यवाद! – devuxer