25

मैं आइटम्स कंट्रोल में एक संग्रह को बांधने की कोशिश कर रहा हूं, कैनवास के साथ आइटम पैनल के रूप में, और प्रत्येक आइटम के कैनवास के साथ। आइटम ऑब्जेक्ट्स पर गुणों के लिए शीर्ष और शीर्ष बाध्य। असल में मैं 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 पर?

उत्तर

15

बाइंडिंग्स सेटर्स पर समर्थित नहीं हैं। मुझे लगता है कि सिल्वरलाइट केवल उन्हें संस्करण 5 में मिला है अगर बिल्कुल। कामकाज के लिए आप मेरे पुराने लेख here देख सकते हैं। असल में आप एक संलग्न निर्भरता संपत्ति को परिभाषित करते हैं जो आपके लिए बाध्यकारी सेट करता है।

<ItemsControl ItemsSource="{Binding TreeMapItems}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas Background="White"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Rectangle Width="{Binding Width}" Height="{Binding Height}" Fill="{Binding Brush}" ToolTipService.ToolTip="{Binding Label}"> 
       <Rectangle.RenderTransform> 
        <TranslateTransform X="{Binding X}" Y="{Binding Y}"/> 
       </Rectangle.RenderTransform> 
      </Rectangle> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+3

एक बहुत चालाक हैक है यही कारण है, और यह वास्तव में WinRT में काम करता है - हालांकि वाक्य रचना अलग है; आपको 'नया बाइंडिंग {पथ = नया प्रॉपर्टीपैथ (नया वैल्यू)} '' नया बाध्यकारी (नया वैल्यू)' के बजाय करना होगा। मुझे यह भी लगता है कि मैं संलग्न पथ का नाम 'पथ' या 'बाइंडिंगपाथ' के साथ समाप्त कर दूंगा ताकि एक्सएएमएल का पालन करना आसान हो। लेकिन सब कुछ, एक अच्छा, व्यावहारिक समाधान। धन्यवाद! –

+0

अंतिम रिलीज win8.9200 (अगस्त 15 के बाद) स्थापित करने के बाद यह <सेटर प्रॉपर्टी = "कैनवास। लिफ्ट" वैल्यू = "200" /> काम नहीं कर रहा है! सोचो कि मैं ग्राफिक्स अनुप्रयोगों में बाध्यकारी छोड़ दूंगा :(क्योंकि यह मुझे एक बड़ा कदम वापस देखता है –

+1

क्या आपने "(कैनवास.लिफ्ट)" की कोशिश की है? –

8

एक RenderTransform लागू करने Silverlight और WinRT/मेट्रो/8.1 में मेरे लिए अच्छी तरह से काम कर रहा है प्रदर्शन।

ItemsControl.PrepareContainerForItemOverride http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.ui.xaml.controls.itemscontrol.preparecontainerforitemoverride.aspx

ListViewBase.ContainerContentChanging http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.ui.xaml.controls.listviewbase.containercontentchanging.aspx

+0

यह मेरे लिए भी बहुत अच्छा काम करता है! धन्यवाद। – KTrace

+1

हालांकि यह एक बहुत पुरानी पोस्ट है, लेकिन आपकी विधि आंशिक रूप से मेरे लिए काम कर रही है, केवल समस्या यह है कि विंडोज़ में कैनवास से बटन बाहर जा रहे हैं फोन 8.1 <बटन ऊंचाई = "{बाइंडिंग ऊंचाई}" चौड़ाई = "{बाइंडिंग चौड़ाई}" सामग्री = "{बाइंडिंग सामग्री}"> < अनुवाद ट्रान्सफॉर्म एक्स = "{बाध्यकारी TopLeftX} "वाई =" {बाइंडिंग TopLeftY} "/> किसी भी विचार क्या गलत? – Debhere

0

विकल्प:: यहाँ "आइटम" के निर्माण से पहले के दौरान कोड के माध्यम से बाइंडिंग संलग्न करने के लिए अन्य अवसर हैं