2013-04-11 14 views
5

Sto tentando di creare un DataTemplate che può essere condiviso per tutte le colonne di un GridView, che ha le sue colonne create dinamicamente (tramite code-behind).Modello di cella condivisa GridView WPF per tutte le colonne

Vorrei creare lo DataTemplate come risorsa in XAML anziché interamente nel code-behind, ma non riesco a capire come far funzionare correttamente i binding.

Il seguente è il più vicino ho potuto venire con (ma non funziona):

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

Questo modello viene assegnato come CellTemplate di ogni colonna come segue:

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

Davvero, non ci sono acquirenti? – ChandlerPelhams

+0

Potresti risolvere il problema? Sto avendo lo stesso problema ora :( – Fabian

risposta

1

I' avendo lo stesso identico problema

Desidero essere in grado di applicare il modello di dati a colonne diverse ma avere ciascuna colonna associata a un campo dati separato.

<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

Presumo che il problema che stai avendo qui è che non puoi usare 'DisplayMemberBinding' e' CellTemplate' insieme.Non capisco perché no, ma mi sta causando problemi. .. – CJBrew

0

Risposta:

Impostare un DataTemplate nelle risorse

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

Crea il tuo vista griglia e rendere le colonne ereditano questa 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> 

Questo exmaple mostra come creare una doppia riga selezionabile in una GridViewColumn. Basta modificare il DataTemplate come meglio credi

Problemi correlati