2013-02-01 8 views
13

में प्रत्येक डेटाटाइप के लिए डेटा टेम्पलेट मेरे पास एक ऑब्जर्जेबल कोलेक्शन है जिसमें कई प्रकार के दृश्य मॉडल शामिल हैं, और मैं अपने प्रत्येक ग्रिड व्यू कॉलम के सेल टेम्पलेट्स में प्रत्येक प्रकार के लिए डेटा टेम्पलेट बनाना चाहता हूं। इस सरल उदाहरण में मैं बेस व्यू मॉडेल बना सकता हूं, लेकिन मैं इसे xaml से ही करने में सक्षम होना चाहता हूं। नीचे xaml दिखाता है कि मैं क्या करने की कोशिश कर रहा हूं, जहां प्रत्येक सेल टेम्पलेट के लिए डेटा टेम्पलेट का उपयोग किया जाएगा।GridViewColumn CellTemplate

यदि कोई ग्रिड व्यू कॉलम था। स्रोत मैं डेटा टेम्पलेट्स को परिभाषित करता हूं, फिर सेल टेम्पलेट में सामग्री प्रस्तुतकर्ता के साथ डेटा टेम्पलेट का उपयोग करता हूं, लेकिन मैं स्पष्ट रूप से ऐसा नहीं कर सकता। मुझे लगता है कि मुझे टेम्पलेट चयनकर्ता की आवश्यकता हो सकती है, लेकिन मुझे यकीन नहीं है कि कहां से शुरू करना है।

<ListView ItemsSource={Binding GenericObservableCollection> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Type"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate DataType="{x:Type vm:ActionInputViewModel}"> 
         <TextBlock Text="Input"/> 
        </DataTemplate> 
        <DataTemplate DataType="{x:Type vm:ActionOutputViewModel}"> 
         <TextBlock Text="Output"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="Value"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate DataType="{x:Type vm:ActionInputViewModel}"> 
         <TextBlock Text="{Binding Property1}"/> 
        </DataTemplate> 
        <DataTemplate DataType="{x:Type vm:ActionOutputViewModel}"> 
         <TextBlock Text="{Binding Property2}"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

उत्तर

30

यहां कुछ अलग-अलग तरीके हैं जिन्हें आप यहां जा सकते हैं। आप एक DataTemplateSelector लिखने और GridViewColumn.CellTemplateSelector संपत्ति है कि आवंटित कर सकते हैं:

public class ViewModelTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate InputTemplate { get; set; } 
    public DataTemplate OutputTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     return (item is ActionInputViewModel) ? InputTemplate : OutputTemplate; 
    } 
} 

तो फिर तुम संसाधन के लिए सभी टेम्पलेट्स कहीं स्थानांतरित कर सकते हैं - यहाँ मैं सिर्फ संक्षिप्तता के लिए ListView में यह अटक गया है:

<ListView ItemsSource="{Binding GenericObservableCollection}"> 
     <ListView.Resources> 
      <DataTemplate x:Key="InLabel" DataType="{x:Type vm:ActionInputViewModel}"> 
       <TextBlock Text="Input"/> 
      </DataTemplate> 
      <DataTemplate x:Key="OutLabel" DataType="{x:Type vm:ActionOutputViewModel}"> 
       <TextBlock Text="Output"/> 
      </DataTemplate> 
      <DataTemplate x:Key="InValue" DataType="{x:Type vm:ActionInputViewModel}"> 
       <TextBlock Text="{Binding Property1}"/> 
      </DataTemplate> 
      <DataTemplate x:Key="OutValue" DataType="{x:Type vm:ActionOutputViewModel}"> 
       <TextBlock Text="{Binding Property2}"/> 
      </DataTemplate> 
     </ListView.Resources> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Type"> 
        <GridViewColumn.CellTemplateSelector> 
         <vm:ViewModelTemplateSelector InputTemplate="{StaticResource InLabel}" OutputTemplate="{StaticResource OutLabel}"/> 
        </GridViewColumn.CellTemplateSelector> 
       </GridViewColumn> 
       <GridViewColumn Header="Value"> 
        <GridViewColumn.CellTemplateSelector> 
         <vm:ViewModelTemplateSelector InputTemplate="{StaticResource InValue}" OutputTemplate="{StaticResource OutValue}"/> 
        </GridViewColumn.CellTemplateSelector> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 

वैकल्पिक रूप से, यदि आप इसे एक्सएएमएल में रखना चाहते हैं तो आप अपने लिए सही टेम्पलेट्स को हल करने के लिए डेटाटाइप पर भरोसा कर सकते हैं। आम तौर पर आप उन्हें निकटतम कंटेनर के संसाधन संग्रह में डाल देंगे लेकिन दुर्भाग्यवश GridViewColumn UI तत्व नहीं है, इसलिए संसाधन संग्रह नहीं है। आप इस के आसपास प्रत्येक कोशिका जो अपनी ही टाइप किया टेम्पलेट्स धारण कर सकते हैं के लिए एक ContentControl में जोड़कर प्राप्त कर सकते हैं:

<ListView ItemsSource="{Binding GenericObservableCollection}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Type"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <ContentControl Content="{Binding}"> 
           <ContentControl.Resources> 
            <DataTemplate DataType="{x:Type vm:ActionInputViewModel}"> 
             <TextBlock Text="Input"/> 
            </DataTemplate> 
            <DataTemplate DataType="{x:Type vm:ActionOutputViewModel}"> 
             <TextBlock Text="Output"/> 
            </DataTemplate> 
           </ContentControl.Resources> 
          </ContentControl> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
       <GridViewColumn Header="Value"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <ContentControl Content="{Binding}"> 
           <ContentControl.Resources> 
            <DataTemplate DataType="{x:Type vm:ActionInputViewModel}"> 
             <TextBlock Text="{Binding Property1}"/> 
            </DataTemplate> 
            <DataTemplate DataType="{x:Type vm:ActionOutputViewModel}"> 
             <TextBlock Text="{Binding Property2}"/> 
            </DataTemplate> 
           </ContentControl.Resources> 
          </ContentControl> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 

किसी भी तरह से आप एक ही परिणाम देना चाहिए।

+0

बिल्कुल सही। मैंने उन दोनों दृष्टिकोणों के विस्तृत उत्तर प्रदान करने के लिए धन्यवाद जिन्हें मैंने माना था। – scuba88

+0

गीज़, मैं घंटों तक घूमने के बाद बहुत करीब था, लेकिन आपने इसे दबाया। मेरी त्रुटि यह थी कि मैं 'ContentControl' के' DataContext' को बाध्यकारी कर रहा था, जैसा कि आप 'सामग्री' के विपरीत सही ढंग से इंगित करते हैं। Kudos और धन्यवाद। –

+0

मुझे यह पसंद है जब लोग वास्तव में अपने उत्तर पर समय बिताते हैं। यह आपके द्वारा प्रदान किए गए विवरण में स्पष्ट है। अच्छी नौकरी। +1। – cplotts

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