2012-12-11 36 views
6

मेरे पास एक संग्रह है जिसे मैं एक WPF ग्रिड से बांधना चाहता हूं।गतिशील कॉलम के साथ wpf ग्रिड

मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि कॉलम की संख्या गतिशील है और संग्रह पर निर्भर है।

public interface IRows 
{ 
    string Message{get;} 
    IColumns[] Columns{get;} 
} 

public interface IColumns 
{ 
    string Header {get;} 
    AcknowledgementState AcknowledgementState{get;} 
} 

public interface IViewModel 
{ 
    ObservableCollection<IRows> Rows {get;} 
} 

मैं मेरे विचार पंक्तियाँ संग्रह है, जो कॉलम का संग्रह होता करने के लिए बाध्य करना चाहते हैं: यहाँ एक सरल ऊपर नकली है।

मेरे कॉलम संग्रह में एक enum होता है जिसे एक छवि (3 संभावनाओं में से 1) द्वारा दर्शाया जाना चाहिए। इसमें एक संदेश संपत्ति भी होती है जिसे केवल एक कॉलम में प्रदर्शित किया जाना चाहिए (स्थिर और केवल कुछ टेक्स्ट जानकारी है)। इसमें एक शीर्षलेख स्ट्रिंग भी शामिल है जिसे उस कॉलम के लिए शीर्षलेख के रूप में प्रदर्शित किया जाना चाहिए।

The link to what I want to show

ध्यान दें कि स्तंभों की संख्या चर रहा है (इस समय हेडर स्वीकार की तैयारी में हैं, लेकिन यह गतिशील डेटा का प्रतिनिधित्व करने के लिए बदल जाएगा)।

अपडेट: यह राहेल

<ItemsControl 
ItemsSource="{Binding Items, Converter={StaticResource PresentationConverter}}"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Grid ShowGridLines="true" 
     local:GridHelpers.RowCount="{Binding RowCount}" 
     local:GridHelpers.ColumnCount="{Binding ColumnCount}" /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemContainerStyle> 
    <Style> 
     <Setter Property="Grid.Row" Value="{Binding RowIndex}"/> 
     <Setter Property="Grid.Column" Value="{Binding ColumnIndex}"/> 
    </Style> 
    </ItemsControl.ItemContainerStyle> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding}"> 
     <ContentControl.Resources> 
      <DataTemplate DataType="{x:Type UI:MessageEntity}"> 
      <TextBox Text="{Binding Message}"></TextBox> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type UI:StateEntity}"> 
      <TextBox Text="{Binding State}"></TextBox> 
      </DataTemplate> 
     </ContentControl.Resources> 
     </ContentControl> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

से सुझाव को लागू करने के बाद यह लगभग मुझे देता है अब मैं क्या चाहता हूँ। मैं केवल हेडर्स के लिए क्या करना चाहिए इसके साथ अटक गया हूं। कोई भी सुझाव स्वागत है।

+0

प्राप्त करने के लिए ऐसा करने के लिए, अधिकतम जानकारी देने का एक उदाहरण के साथ उठाया है। लिंक शामिल है ... – Harry

+0

सरलीकृत और एक लिंक जोड़ा। – zman

+0

पंक्तियों और coloumns गतिशील रूप से जोड़ने के तरीके पर लिंक - http://stackoverflow.com/questions/13344788/how-to-create-listview-to-a-grid-programmatically/ – Sai

उत्तर

5

आप इस

यहाँ के लिए नेस्टेड ItemsControls उपयोग कर सकते हैं एक बुनियादी उदाहरण है संपत्ति बदल दी) कॉलम बनाने के लिए।

+0

यह लगभग वही है जो मैं चाहता हूं। मैंने इस विचार का उपयोग करके समाधान लागू करने का प्रयास किया है, लेकिन जब मैंने हेडर पंक्ति जोड़ दी तो मुझे समस्याएं मिलीं, जिन्हें मैंने आइटम्स कंट्रोल (केवल इसके ऊपर एक स्टैक पैनल) से स्वतंत्र किया है। कॉलम की चौड़ाई को व्यवस्थित करना बहुत मुश्किल है ताकि वे सिंक्रनाइज़ हो जाएं। – zman

+1

@ManuelZanin आप एक [साझा आकार स्कोप] (http://msdn.microsoft.com/en-us/library/system.windows.controls.grid.issharedsizescope.aspx) संलग्न ग्रिड के साथ ग्रिड का उपयोग कर सकते हैं, हालांकि आपको इसकी आवश्यकता है अग्रिम में कॉलम परिभाषाओं को परिभाषित करें। यदि कॉलम की संख्या बदल सकती है, तो मेरे पास ग्रिड के लिए कुछ संलग्न गुण हैं [मेरे ब्लॉग पर] (http://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/) जो आपको कॉलमडिफिनिशन मैन्युअल रूप से निर्दिष्ट करने के बजाय कॉलम गिनती को बांधने देता है। – Rachel

+0

ठीक है, मुझे आपके सुझावों के लिए धन्यवाद मिल रहा है। मैंने अपना प्रश्न अपडेट किया है। एकमात्र शेष मुद्दा हेडरों से अच्छी तरह से निपटने का तरीका है। यदि मैं आइटम्स कंट्रोल का उपयोग करके इसे काम नहीं कर पा रहा हूं तो मुझे एक सूची दृश्य का उपयोग करना पड़ सकता है (हालांकि मैं इस नियंत्रण से बहुत परिचित नहीं हूं)। – zman

2

एक ग्रिड दृष्टिकोण का उपयोग करके चीजों को जितना जटिल होना चाहिए उससे अधिक जटिल हो सकता है। क्या आपने किसी सूचीदृश्य के टेम्पलेट को बदलने का प्रयास किया है, या इस उद्देश्य के लिए डेटाग्रिड का उपयोग करने की कोशिश की है? http://www.codeproject.com/Articles/25058/ListView-Layout-Manager

या यह एक:

एक उदाहरण के लिए, इस परियोजना पर एक नज़र डालें http://www.codeproject.com/Articles/16009/A-Much-Easier-to-Use-ListView

आप ग्रिड के साथ जाना है, तो मेरा मानना ​​है कि आप के लिए पीछे कोड का एक बहुत कुछ जोड़ना होगा कॉलम और पंक्तियों, उनके आकार, सेल सामग्री की मात्रा का प्रबंधन करें ... जबकि एक सूची दृश्य/डेटाग्रिड आपको टेम्पलेट्स के माध्यम से गतिशील रूप से ऐसा करने देगा।

<!-- Bind Rows using the default StackPanel for the ItemsPanel --> 
<ItemsControl ItemsSource="{Binding Rows}"> 
    <!-- Set the Template for each row to a TextBlock and another ItemsControl --> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <!-- Need to set Width of name TextBlock so items line up correctly --> 
       <TextBlock Width="200" Text="{Binding Name}" /> 

       <ItemsControl ItemsSource="{Binding Columns}"> 
        <!-- Use a horizontal StackPanel to display columns --> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel Orientation="Horizontal" /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
       </ItemsControl> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

वे लिंक मैंने जो कॉलम संग्रह देखा है उससे निपट नहीं है। – Paparazzi

+0

@ ब्लाम और वे ग्रिड से भी निपटते नहीं हैं! जो वास्तव में मेरा मुद्दा है: एक सूची दृश्य के अंदर एक डेटा टेम्पलेट ओपी के परिदृश्य के लिए एक अधिक उपयुक्त समाधान हो सकता है। जब मैंने डब्ल्यूपीएफ शुरू किया, मैंने एक बार कक्षा को कोड करना शुरू कर दिया है जो एक अज्ञात राशि के कॉलम + हेडर के साथ ग्रिड उत्पन्न करेगा, और अंततः ListView के बारे में सीखा और यह इस प्रकार की समस्या को कैसे सरल बनाता है - खासकर जब से ओपी यह शुद्ध होना चाहता है एक्सएएमएल समाधान। – Joe

+0

आप एक अच्छा मुद्दा बनाते हैं, शायद मैं अपने लिए जीवन को बहुत मुश्किल बना रहा हूं। मैंने लिस्ट व्यू/ग्रिड व्यू का उपयोग करने के बारे में सोचा है, लेकिन मुझे जो कुछ भी चाहिए वो हासिल करने के लिए मुझे उनका उपयोग करने का कोई उदाहरण नहीं मिला है (मैं डब्ल्यूपीएफ पर काफी जंगली हूं जो मदद नहीं करता है)। आपके द्वारा पोस्ट किए गए उदाहरण उपयोगी हैं लेकिन मुझे लगता है कि यह मेरे उद्देश्य के लिए अधिक है। – zman

0

आपके कॉलम बनाने के लिए गतिशील ऑब्जेक्ट का उपयोग करने का विकल्प भी है। यह थोड़ा श्रमिक है लेकिन परिणाम बहुत प्रभावी हैं और सामान्य रूप से समाधान काफी लचीला है।

इस गतिशील वस्तु Binding DynamicObject to a DataGrid with automatic column generation?

करने के लिए आप मूल बातें दिखाई देगा मैं कुछ नेस्टेड वस्तुओं, कॉलम वस्तुओं और फिर वस्तु के लिए सेल सामग्री के लिए बाध्य करने की कोशिश कर उस के साथ यह उपयोग करने में समस्या थी।

यहाँ एक सवाल मैं कैसे इस मदद

Problems binding to a the content of a WPF DataGridCell in XAML