मैं आइटम्स कंट्रोल में एक संग्रह को बांधने की कोशिश कर रहा हूं, कैनवास के साथ आइटम पैनल के रूप में, और प्रत्येक आइटम के कैनवास के साथ। आइटम ऑब्जेक्ट्स पर गुणों के लिए शीर्ष और शीर्ष बाध्य। असल में मैं this post on my blog में वर्णित 2-डी डाटाबेसिंग को फिर से बनाने की कोशिश कर रहा हूं, लेकिन इस बार WPF के बजाय WinRT में।मैं WinRT में ItemContainerStyle में बाइंडिंग कैसे करूं?
चूंकि आइटम नियंत्रण आपके आइटम टेम्पलेट सामग्री को किसी अन्य UI तत्व (एक सामग्री प्रस्तुतकर्ता, WinRT के मामले में) में लपेटता है, और यह उन रैपर/कंटेनर तत्व हैं जो सीधे आइटम पैनल के अंदर रखे जाते हैं, बाएं और शीर्ष पर सेट होना चाहिए उन कंटेनर; आप उन्हें डेटा टेम्पलेट में सेट नहीं कर सकते हैं। WPF में, यह बहुत आसान ItemContainerStyle में बाइंडिंग के साथ ऐसा करना है उदा .:
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Path=X}"/>
<Setter Property="Canvas.Top" Value="{Binding Path=Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
लेकिन जब मैं एक WinRT/XAML परियोजना में एक ही बात की कोशिश, मैं कुछ भी नहीं मिलता है। बाध्यकारी त्रुटियों को भी नहीं। यदि मैं एक मूल्य को हार्ड-कोड करता हूं, तो यह काम करता है; लेकिन अगर मैं बाध्यकारी का उपयोग करता हूं, तो संपत्ति सिर्फ इसके डिफ़ॉल्ट मान (शून्य) पर रहता है, और आउटपुट विंडो में कोई बाध्यकारी त्रुटियां नहीं दिखाई देती हैं।
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<!-- This works, so ItemContainerStyle does work in WinRT: -->
<Setter Property="Canvas.Left" Value="200"/>
<!-- But this silently fails, leaves Top as 0, and does not show
any binding errors in the debugger's Output window: -->
<Setter Property="Canvas.Top" Value="{Binding Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
मैं यह सत्यापित किए जाने ContentPresenters सही DataContext है कि (अर्थात संग्रह आइटम, नहीं संग्रह खुद या फिर कोई अन्य फैशनेबल), तो आप लगता है कि इन बाइंडिंग ठीक काम करेगा। लेकिन उन्हें मूल्यांकन भी नहीं लगता है। यदि मैं कहीं और खराब बाध्यकारी डालता हूं, और डीबग बिल्ड चलाता हूं, तो मुझे डीबगर की आउटपुट विंडो में बाध्यकारी त्रुटियां दिखाई देती हैं; लेकिन अगर मैं अपने ItemContainerStyle के अंदर एक बकवास संपत्ति का संदर्भ देता हूं, तो कोई बाध्यकारी त्रुटियां नहीं दिखायी जाती हैं।
यहाँ (के रूप में तक मुझे पता है) WPF में ठीक काम करना चाहिए और अधिक पूर्ण उदाहरण के लिए, कि है, लेकिन वह WinRT में मूल में सब कुछ छोड़ देता है:
<ItemsControl ItemsSource="{Binding Tiles}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding DataContext.Left}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Width="80" Height="80" Fill="Gray"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
मैं और अधिक के कुछ कोशिश की है Binding
पर विदेशी विकल्प - विशेष रूप से RelativeSource
। जब मैंने RelativeSource TemplatedParent
का उपयोग किया, तो कुछ भी व्यवहार व्यवहार अपरिवर्तित नहीं था। हालांकि, जब मैंने RelativeSource Self
का उपयोग किया, तो मुझे बाध्यकारी त्रुटि मिली, यह कहकर कि संपत्ति Setter
पर मौजूद नहीं थी! यह Self
ले रहा है, वहां थोड़ा सा शाब्दिक रूप से है।
मैंने TemplateBinding
के साथ भी खेला, लेकिन मैंने वास्तव में जो कुछ भी इस्तेमाल किया है, उसे कभी भी गड़बड़ नहीं किया, और मुझे जो कुछ मिला वह कुछ समझ में नहीं आया COM COM (WinRT में आपका स्वागत है, एक बड़ा तकनीकी कदम पिछड़ा)।
मैं या तो (क) बाइंडिंग सही ढंग से काम कर सकते हैं कैसे (वहाँ है कि मैं यह मजबूर करने के लिए इस्तेमाल कर सकते हैं Binding
के अन्य विकल्पों को काम करने के लिए ठीक से कर रहे हैं?), या (ख) अन्यथा मनमाने ढंग से तैनात किया जाना करने के लिए अपने ItemsContainer
में आइटम की अनुमति देते हैं संग्रह वस्तुओं पर गुणों के लिए डेटाबेस पर आधारित Canvas
पर?
एक बहुत चालाक हैक है यही कारण है, और यह वास्तव में WinRT में काम करता है - हालांकि वाक्य रचना अलग है; आपको 'नया बाइंडिंग {पथ = नया प्रॉपर्टीपैथ (नया वैल्यू)} '' नया बाध्यकारी (नया वैल्यू)' के बजाय करना होगा। मुझे यह भी लगता है कि मैं संलग्न पथ का नाम 'पथ' या 'बाइंडिंगपाथ' के साथ समाप्त कर दूंगा ताकि एक्सएएमएल का पालन करना आसान हो। लेकिन सब कुछ, एक अच्छा, व्यावहारिक समाधान। धन्यवाद! –
अंतिम रिलीज win8.9200 (अगस्त 15 के बाद) स्थापित करने के बाद यह <सेटर प्रॉपर्टी = "कैनवास। लिफ्ट" वैल्यू = "200" /> काम नहीं कर रहा है! सोचो कि मैं ग्राफिक्स अनुप्रयोगों में बाध्यकारी छोड़ दूंगा :(क्योंकि यह मुझे एक बड़ा कदम वापस देखता है –
क्या आपने "(कैनवास.लिफ्ट)" की कोशिश की है? –