2009-10-28 23 views
5

मैं वर्तमान में सिल्वरलाइट 3 में एक कैनवास के लिए वस्तुओं का संग्रह बाध्य करने के लिए नीचे के रूप में एक ItemsControl का उपयोग कर कोशिश कर रहा हूँ पर एक आयत की स्थिति बाइंडिंग:सिल्वरलाइट 3 - डाटा एक कैनवास

<ItemsControl x:Name="ctrl" ItemsSource="{Binding myObjectsCollection}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas></Canvas> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Rectangle Stroke="LightGray" Fill="Black" StrokeThickness="2" 
        RadiusX="15" RadiusY="15" Canvas.Left="{Binding XAxis}" 
        Height="25" Width="25"> 
      </Rectangle> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

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

क्या कोई तरीका है कि मैं कैनवास पर तत्वों की स्थिति निर्धारित करने के लिए डेटा बाइंडिंग का उपयोग कर सकता हूं?

उत्तर

7

मुझे पता है यह पहले से ही एक जवाब को स्वीकार कर लिया है, लेकिन जिस तरह से मार्जिन के साथ खिलवाड़ के बिना प्रारंभिक लक्ष्य को प्राप्त करने के लिए एक कस्टम बनाने के लिए है कि ItemsControl और PrepareContainerForItemOverride विधि को ओवरराइड करें। इस विधि में, आप कोड में बाइंडिंग सेट करते हैं।

public class CustomItemsCollection 
    : ItemsControl 
{ 
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 

     FrameworkElement contentitem = element as FrameworkElement; 
     Binding leftBinding = new Binding("Left"); // "Left" is the property path that you want to bind the value to. 
     contentitem.SetBinding(Canvas.LeftProperty, leftBinding); 

     base.PrepareContainerForItemOverride(element, item); 
    } 

} 
1

आप सही हैं, एक सामग्री प्रस्तुतकर्ता कैनवास और आयताकार के बीच डाला गया है। एक वैकल्पिक हल एक Canvas.Left के बजाय एक बाईं मार्जिन सेट करने के लिए होगा:

<Rectangle Stroke="LightGray" Fill="Black" StrokeThickness="2" 
     RadiusX="15" RadiusY="15" Height="25" Width="25"> 
    <Rectangle.Margin> 
     <Thickness Left="{Binding XAxis}"/> 
    </Rectangle.Margin> 
</Rectangle> 
+0

दुर्भाग्य से संपत्ति बाईं ओर पढ़ी जाती है और सेट नहीं की जा सकती है। – Blounty

+1

मुझे नहीं पता कि यह केवल पढ़ने के लिए क्यों है। वैसे भी मैं एक मूल्य कनवर्टर का उपयोग करके उस काम को करने में कामयाब रहा: <आयत = मार्जिन = "{बाइंडिंग एक्सएक्सिस, कनवर्टर = {स्टेटिक रिसोर्स वाममार्गिन कनवर्टर}}" /> लेकिन यह निश्चित रूप से एक सुरुचिपूर्ण समाधान नहीं है। – Mart

+0

वाममार्गिन कनवर्टर कैसे काम करता है और जब यह लागू होता है तो मार्जिन कंटेनर के बाएं किनारे के सापेक्ष सभी बाध्य वस्तुओं पर लागू होता है? – Blounty

-2

अपने ItemsControl

<ItemsControl.ItemContainerStyle> 
    <Style TargetType="{x:Type ContentPresenter}"> 
     <Setter Property="Canvas.Left" Value="{Binding XPath=XAxis}"/> 
    </Style> 
    </ItemsControl.ItemContainerStyle> 

किसी भी कस्टम के लिए कोई ज़रूरत नहीं नियंत्रित करता

+1

यह काम नहीं कर सकता है, क्योंकि आइटम्सकंट्रोल में सिल्वरलाइट (v3 या v4) में ItemContainerStyle प्रॉपर्टी नहीं है। डब्ल्यूपीएफ में हाँ, लेकिन यह सवाल नहीं है। – Anthony

2

आप सिल्वरलाइट में ItemsControl.ItemContainerStyle उपयोग नहीं कर सकते करने के लिए निम्न जोड़ें। यह अस्तित्व में नहीं है। यह केवल कुछ पत्ती स्तर वर्गों पर मौजूद है जैसे ListBox स्वयं।

1

मुझे पता है कि यह प्रश्न थोड़ा पुराना है, लेकिन आप केवल रेंडर ट्रांसफॉर्म का उपयोग कर सकते हैं - मैं कुछ ऐसा कर रहा हूं;

<ItemsControl ItemsSource="{Binding Notes}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas Background="Aqua"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Border Width="{Binding W}" Height="{Binding H}" BorderBrush="Navy" BorderThickness="5" CornerRadius="10"> 
       <TextBlock Text="{Binding Text}"/> 
       <Border.RenderTransform> 
        <TransformGroup> 
         <RotateTransform Angle="0"/> 
         <TranslateTransform X="{Binding X}" Y="{Binding Y}"/> 
        </TransformGroup> 
       </Border.RenderTransform> 
      </Border> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
संबंधित मुद्दे