2013-04-11 5 views
5

मैं DataTemplate बनाने की कोशिश कर रहा हूं जिसे GridView के सभी कॉलम के लिए साझा किया जा सकता है, जिसमें इसके कॉलम गतिशील रूप से बनाए गए हैं (कोड-पीछे के माध्यम से)।WPF GridView सभी कॉलम के लिए साझा सेल टेम्पलेट

मैं पूरी तरह से कोड-बैक के बजाय XAML में संसाधन के रूप में DataTemplate बनाना चाहता हूं, लेकिन मैं यह नहीं समझ सकता कि बाइंडिंग को सही तरीके से कैसे काम करना है।

निम्नलिखित निकटतम मैं के साथ आ सकता है (लेकिन काम नहीं करता है):

BindableDataTable table = this.DataContext as BindableDataTable; 

      foreach (BindableDataColumn c in table.Columns) 
      { 
       GridViewColumn col = new GridViewColumn(); 
       col.Header = c.ColumnName; 

       col.CellTemplate = this.FindResource("ListViewCellTemplate") as DataTemplate; 
       v.Columns.Add(col); 
      } 
+1

वास्तव में, कोई लेकर्स नहीं है? – ChandlerPelhams

+0

क्या आप समस्या का समाधान कर सकते हैं? मुझे अब भी यही समस्या है :( – Fabian

उत्तर

1

मैं: इस प्रकार

<DataTemplate x:Key="ListViewCellTemplate"> 
     <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type GridViewColumn}}}" /> 
    </DataTemplate> 

इस टेम्पलेट प्रत्येक स्तंभ के CellTemplate के रूप में असाइन किया गया है मुझे एक ही समस्या है।

मैं अलग-अलग स्तंभों में डेटा टेम्पलेट को लागू करने में सक्षम होना चाहता हूं लेकिन प्रत्येक कॉलम को एक अलग डेटा फ़ील्ड में बाध्य किया गया है।

<ListView ItemsSource="{Binding}" Name="listViewIMS" Grid.Row="1" Margin="0,0,0,4" FontSize="11" AlternationCount="2" SelectionMode="Extended"> 

     <ListView.Resources> 
      <DataTemplate x:Key="Templ"> 
       <TextBlock TextAlignment="Left" Text="{Binding}"/> 
      </DataTemplate> 
      <DataTemplate x:Key="Tempr"> 
       <TextBlock Width="78" Margin="-6,0" TextAlignment="Right" Text="{Binding}" /> 
      </DataTemplate> 
      <Style x:Key="HeaderStyleRight" TargetType="GridViewColumnHeader"> 
       <Setter Property="HorizontalContentAlignment" Value="Right"/> 
      </Style> 
      <Style x:Key="HeaderStyleLeft" TargetType="GridViewColumnHeader"> 
       <Setter Property="HorizontalContentAlignment" Value="Left"/> 
      </Style>     
     </ListView.Resources> 

     <ListView.View> 
      <GridView x:Name="gridViewInvoices"> 
       <GridViewColumn Width="80" DisplayMemberBinding="{Binding Document}"> 
        <GridViewColumnHeader Tag="docNo" Content="Document" /> 
       </GridViewColumn>     
       <GridViewColumn Width="220" DisplayMemberBinding="{Binding Customer}"> 
        <GridViewColumnHeader Tag="customer" Content="Customer"/> 
       </GridViewColumn> 
       <GridViewColumn Width="100" DisplayMemberBinding="{Binding inv_date, StringFormat='dd/MM/yy'}" > 
        <GridViewColumnHeader Tag="date" Content="Date" /> 
       </GridViewColumn> 
       <GridViewColumn Width="100" DisplayMemberBinding="{Binding inv_l_catalogue}" > 
        <GridViewColumnHeader Tag="catalogue" Content="Item" /> 
       </GridViewColumn> 
       <GridViewColumn Width="60" DisplayMemberBinding="{Binding inv_l_qty}" > 
        <GridViewColumnHeader Tag="qty" Content="Qty" /> 
       </GridViewColumn> 
       <GridViewColumn Width="80" DisplayMemberBinding="{Binding inv_l_price, StringFormat='0.00' }" > 
        <GridViewColumnHeader Tag="unitPrice" Content="Price" /> 
       </GridViewColumn> 
       <GridViewColumn Width="50" DisplayMemberBinding="{Binding inv_l_per}" > 
        <GridViewColumnHeader Tag="per" Content="Per" /> 
       </GridViewColumn> 
       <GridViewColumn Header="Goods" CellTemplate ="{StaticResource Tempr}" HeaderContainerStyle="{StaticResource HeaderStyleRight}" Width="80" > 

        <!--GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Width="78" Margin="-6,0" TextAlignment="Right" Text="{Binding inv_l_lgoods2, StringFormat='0.00'}" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate>--> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 

    </ListView> 
+1

मुझे लगता है कि आप यहां मौजूद समस्या का मानना ​​है कि आप 'DisplayMemberBinding' और' CellTemplate 'का एक साथ उपयोग नहीं कर सकते हैं। मुझे समझ में नहीं आता क्यों नहीं, लेकिन इससे मुझे परेशानी भी हो रही है। .. – CJBrew

0

उत्तर:

अपने संसाधनों में एक DataTemplate सेट

<UserControl.Resources> 
     <ResourceDictionary> 
      <DataTemplate x:Key="GridViewCellTemplateStyle"> 
       <TextBlock Text="{Binding}"> 
        <TextBlock.InputBindings> 
         <MouseBinding Gesture="LeftDoubleClick" Command="{Binding DataContext.CommandDoubleClick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"/> 
        </TextBlock.InputBindings> 
       </TextBlock> 
      </DataTemplate> 
     </ResourceDictionary> 
    </UserControl.Resources> 

अपने ग्रिड दृश्य बना सकते हैं और कॉलम इस DataTemplate

<ListView> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Width="Auto" Header="Column1" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/> 
        <GridViewColumn Width="Auto" Header="Column2" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/> 
        <GridViewColumn Width="Auto" Header="Column3" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/> 
        <GridViewColumn Width="Auto" Header="Column4" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 

इस उदाहरण के दिखाता है कि करने के लिए वारिस बनाना एक GridViewColumn में एक डबल क्लिक करने योग्य पंक्ति बनाएँ। बस डेटा टेम्पलेट को बदलें क्योंकि आप फिट

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