2013-04-11 12 views
5

GridViewのすべての列で共有できるDataTemplateを作成しようとしていますが、列は動的に(コードビハインドによって)作成されています。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

回答:あなたのグリッドビューを作成し、列はこのexmapleは、あなたがどのように示して

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

この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を設定

GridViewColumnでダブルクリック可能な行を作成します。 DataTemplateを適切に変更してください

関連する問題