2013-04-11 1 views
5

Ich versuche, eine DataTemplate erstellen, die für alle Spalten einer GridView freigegeben werden kann, die ihre Spalten dynamisch erstellt hat (durch Code-Behind).WPF GridView Shared Cell Vorlage für alle Spalten

Ich möchte die DataTemplate als Ressource in XAML anstelle von vollständig in Code-Behind erstellen, aber ich kann nicht herausfinden, wie die Bindungen ordnungsgemäß funktionieren.

Im Folgenden ist der nächste, was ich tun konnte, (aber nicht funktioniert):

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

Diese Vorlage als CellTemplate jeder Spalte zugeordnet ist wie folgt:

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

Wirklich, keine Abnehmer? – ChandlerPelhams

+0

Können Sie das Problem lösen? Ich habe jetzt das gleiche Problem :( – Fabian

Antwort

1

I‘ m genau das gleiche Problem.

Ich möchte die Datenvorlage auf verschiedene Spalten anwenden können, aber jede Spalte an ein separates Datenfeld gebunden haben.

<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

Ich nehme an, das Problem, das Sie hier haben, ist, dass Sie 'DisplayMemberBinding' und' CellTemplate' nicht zusammen verwenden können. Ich verstehe nicht warum nicht, aber es verursacht mir auch Ärger. .. – CJBrew

0

Antwort:

Legen Sie ein Datatemplate in Ihre Ressourcen

<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> 

Ihre Grid-Ansicht erstellen und machen die Spalten dieses Datatemplate erben

<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> 

Dieses exmaple Sie zeigt, wie man Erstellen Sie eine doppelt anklickbare Zeile in einer GridViewColumn. Ändern Sie einfach das DataTemplate, wie Sie sehen