2012-08-07 12 views
10

WPF डेटाग्रिड्स में, मेरे पास डेटाग्रिड टेम्पलेट कॉलम के रूप में परिभाषित कॉलम है जिसे मुझे सभी प्रकार के कॉलम पर उपयोग करने की आवश्यकता होगी। एक बहुत ही सरल उदाहरण के रूप में एक डमी नमूना के रूप में नीचे पर विचार करें:WPF DataGridTemplateColumn (बाइंडिंग सहित) का पुन: उपयोग कैसे करें

<DataGrid ItemsSource="{Binding Path=ItemList, Mode=OneWay}" AutoGenerateColumns="False" >     
    <DataGrid.Columns> 

     <DataGridTemplateColumn Header="Name" MinWidth="130" Width="Auto"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <DockPanel LastChildFill="True"> 
         <Image Source="component/Images/test.png"/> 
         <TextBlock Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnDataErrors=True}"/> 
        </DockPanel>         
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <DockPanel LastChildFill="True"> 
         <Image Source="component/Images/test.png"/> 
         <TextBox Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnDataErrors=True}"/> 
        </DockPanel> 
       </DataTemplate>        
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 

     <DataGridTextColumn Header="Company" Binding="{Binding Company, ValidatesOnDataErrors=True}" MinWidth="115" Width="Auto"/>      
    </DataGrid.Columns> 
</DataGrid> 

एक सरल उदाहरण के लिए, मैं कैसे बिना हैडर = कंपनी के साथ स्तंभ के लिए साथ हैडर = नाम स्तंभ के लिए इस्तेमाल एक ही टेम्पलेट लागू हो सकते हैं प्रत्येक कॉलम के लिए पूरे टेम्पलेट को पुन: पेश करें?

मैं this previous SO question साथ एक जवाब है, जहां वे जैसे संसाधनों का उपयोग कर समझाने पाया है:

<Application.Resources> 
    <DataTemplate x:Key="CellTemplate"> 
    ... 
    </DataTemplate> 
    <DataTemplate x:Key="CellEdintingTemplate"> 
    ... 
    </DataTemplate> 
</Application.Resources> 

<DataGrid Style="{StaticResource MainGridStyle}"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn CellTemplate="{StaticResource MyFirstColumnCellTemplate}" CellEdintingTemplate="{StaticResource MyFirstColumnCellEdintingTemplate}"/> 
     ... 
    </DataGrid.Columns> 
<DataGrid> 

वहाँ मुझे हो जाता है यही कारण है कि 95% है, लेकिन अंतिम टुकड़ा मैं याद कर रहा हूँ डेटा बाइंडिंग को संभालने के लिए कैसे है? मैं टेम्पलेट में कुछ प्रकार के प्लेस धारक कैसे बना सकता हूं और फिर ग्रिड में वास्तविक बाध्यकारी कर सकता हूं?

संपादित मैं देख रही है और सवाल Create Common DataGridTemplateColumn जो कि मैं क्या वास्तव में वर्तमान में असंभव हो सकता है क्या करना चाहते हैं की तरह लगता है पाया रखा है। तो अगर कोई और ऐसा करने की कोशिश कर रहा है, और यह सवाल देखता है तो मैं गारंटी नहीं दे सकता कि यह असंभव है, लेकिन इस लिंक से ऐसा लगता है। तो बस हर कॉलम के लिए सभी tempalte कोड डुप्लिकेट करने की आवश्यकता होगी।

उत्तर

6

आप CellStyle संपत्ति को ऐसी शैली में सेट कर सकते हैं जो के लिए Template को ओवरराइट करता है।

Template में, एक ContentPresenter कि TemplatedParent.Content भी आप DataGridCell की सामग्री को रखना चाहते हैं के लिए बाध्य है का उपयोग के बाद से TemplatedParentDataGridCell

उदाहरण के लिए है,

<Style x:Key="MyCellStyle" TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <DockPanel LastChildFill="True"> 
        <Image Source="component/Images/test.png"/> 
        <ContentPresenter Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}" /> 
       </DockPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<DataGrid ItemsSource="{Binding ItemList}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Name" Binding="{Binding Name}" CellStyle="{StaticResource MyCellStyle}" MinWidth="130" Width="Auto" /> 
     <DataGridTextColumn Header="Company" Binding="{Binding Company}" CellStyle="{StaticResource MyCellStyle}" MinWidth="115" Width="Auto"/>      
    </DataGrid.Columns> 
</DataGrid> 
+0

इसके लिए संभव है कहीं भी संसाधनों में परिभाषित डेटा टेम्पलेट का उपयोग करने के लिए ContentPresenter? –

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