2010-12-27 19 views
5

मैं ListBox के लिए कस्टम आइटम नियंत्रण कक्ष डिज़ाइन करना चाहता हूं।डब्ल्यूपीएफ: कस्टम आइटम कंट्रोल पैनल कैसे बनाएं?

  1. यह गुण int rows और int columns जो कि पैनल से बना है कोशिकाओं के मैट्रिक्स को परिभाषित करेगा होना चाहिए: 3 आवश्यकताएं होती हैं। यह वही पैनल की तरह दिखना चाहिए है (रंग अप्रासंगिक, मैं सिर्फ दिखाने के लिए कि पैनल एक 3x4 मैट्रिक्स में 12 रिक्त कक्षों शामिल है चाहता था कर रहे हैं): आइटम में आइटमों की संख्या को नियंत्रित है alt text

  2. परिभाषित कोशिकाओं की संख्या से कम सभी कोशिकाओं को खींचा जाना चाहिए। जैसे अगर तस्वीर में दिखाए गए 3x4 मैट्रिक्स में केवल 4 आइटम रखे जाएंगे, तो सभी कोशिकाओं को खींचा जाना चाहिए और उनमें से केवल 4 में आइटम होना चाहिए।

  3. यह निर्धारित करना संभव है कि कौन सा सेल कुछ डेटा बाध्यकारी के माध्यम से कौन सा आइटम होस्ट करेगा। उदाहरण के लिए, मान लें कि मेरे पास व्यक्तियों की एक सूची थी। उस सूची में Person के प्रकार और Person कक्षा में दो गुण X और Y शामिल हैं। मुझे X को सेल के row और Y पर सेल के column पर बाइंड करने में सक्षम होना चाहिए, इस प्रकार मैं स्वयं को सेट करने की अनुमति देता हूं कि पैनल में कौन सा सेल सूची में से कौन सा व्यक्ति होगा।

यदि आइटम नियंत्रण कक्ष बनाते हैं तो यह समझ में नहीं आता है, कृपया बेहतर दृष्टिकोण क्या होगा। काफी ईमानदार होने के लिए मैं इस बात से परेशान हूं कि इससे कैसे शुरू किया जाए। पूरी सहायताके लिए शुक्रिया। चीयर्स!

उत्तर

1

इस तरह की समस्या को हल करने के लिए एक उपयोगी रणनीति स्रोत डेटा को ItemsControl द्वारा खपत के लिए उपयुक्त प्रारूप में छेड़छाड़ करना है। उदाहरण के लिए, वस्तुओं की एक द्वि-आयामी सरणी, या वस्तुओं का एक रैखिक संग्रह जिसमें उनके अपने द्वि-आयामी निर्देशांक होते हैं, का उपयोग करना मुश्किल है।

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

<Grid> 
    <Grid.Resources> 
     <coll:ArrayList x:Key="sampleData"> 
      <x:Array Type="sys:String"> 
       <sys:String>1</sys:String><sys:String>2</sys:String> 
      </x:Array> 
      <x:Array Type="sys:String"> 
       <sys:String>3</sys:String<sys:String>4</sys:String> 
      </x:Array> 
     </coll:ArrayList> 
    </Grid.Resources> 
    <ItemsControl ItemsSource="{StaticResource sampleData}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <ItemsControl ItemsSource="{Binding}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel Orientation="Horizontal"/> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <Border BorderBrush="Black" BorderThickness="1" Width="50" Height="50"> 
           <TextBlock Text="{Binding}"/> 
          </Border> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Grid> 

जो पैदा करता है:

+---+---+ 
| 1 | 2 | 
+---+---+ 
| 3 | 4 | 
+---+---+ 
+0

आपके उत्तर के लिए धन्यवाद

यहाँ आप को दिखाने के लिए मैं क्या मतलब है एक 2x2 उदाहरण है। जिस समाधान को मैं ढूंढ रहा हूं वह वास्तव में आपके द्वारा प्रदान नहीं किया गया है। मुझे आपके विचार की तरह लगता है, लेकिन यहां क्या काम नहीं कर रहा है: आपके कोड के साथ, तत्व '3' को छोड़ना संभव नहीं है और अभी भी '2' के नीचे '4' रखा गया है। मुझे यह निर्दिष्ट करने में सक्षम होना चाहिए कि कौन सा तत्व जाएगा * आयताकार * – Boris

+0

आप किसी भी सेल के लिए एक डमी "खाली" आइटम की आपूर्ति कर सकते हैं जिसे आप खाली दिखाना चाहते हैं। दूसरे शब्दों में, हमेशा बारह वस्तुएं होती हैं, भले ही वे सभी खाली हों। फिर नमूनाडेटा [पंक्ति] [col] को असाइन करके केवल गैर-खाली आइटम भरें। –

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