2017-04-06 1 views
1

私は現在のアイテムの基になるデータ型に基づいてセル内の画像を切り替えるDataGridを構築しています。WPF DataGrid:ItemsSoureのDataTypeでCellTemplateを選択

質問: このタイプのテンプレートの切り替えは適用できますか? 好ましくはxaml-only?あらゆる可能な援助のための

<DataGrid 
    ItemsSource="{Binding TicketCollection,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" 
    IsReadOnly="True" 
    AutoGenerateColumns="False" 
    DockPanel.Dock="Top"> 

    <DataGrid.Resources> 
     <DataTemplate DataType="{x:Type models:IncidentModel}"> 
      <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/Active_16.png" /> 

     </DataTemplate> 
     <DataTemplate DataType="{x:Type models:ServiceModel}"> 
      <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/IncidentMgmt_AllIncidents_16.png" /> 

     </DataTemplate> 
    </DataGrid.Resources> 

    <DataGrid.Columns> 

     <DataGridTemplateColumn Header="Typ"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 

       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 

     <DataGridTextColumn Header="Id" Binding="{Binding Id,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" /> 
     <DataGridTextColumn Header="Titel" Binding="{Binding Title,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" /> 
     <DataGridTextColumn Header="Status" Binding="{Binding Status,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" /> 
     <DataGridTextColumn Header="Erstellung" Binding="{Binding CreatedDate,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" /> 
    </DataGrid.Columns> 
</DataGrid> 

ありがとう:

のItemsSourceは、私は現在、午前これは、あるタイプ

IncidentModel : BaseModel 
ServiceModel : BaseModel 

の項目が含まれている

ObservableCollection<BaseModel> 

です!

答えて

1

あなたは追加のContentPresenterとXAMLでそれをすべて行うDataTemplateSelector

public class MyTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate IncidentTemplate { get; set; } 
    public DataTemplate ServiceTemplate { get; set; } 

    public override DataTemplate SelectTemplate 
     (object item, DependencyObject container) 
    { 
     if (item is IncidentModel) return IncidentTemplate; 
     else if (item is ServiceModel) return ServiceTemplate; 
     else return base.SelectTemplate(item, container); 
    } 
} 

XAML

<DataGrid 

    ... 

    > 
    <DataGrid.Resources> 
     <DataTemplate x:Key="IncidentTemplate" DataType="{x:Type models:IncidentModel}"> 
      <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/Active_16.png" /> 
     </DataTemplate> 
     <DataTemplate x:Key="ServiceTemplate" DataType="{x:Type models:ServiceModel}"> 
      <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/IncidentMgmt_AllIncidents_16.png" /> 
     </DataTemplate> 

     <local:MyTemplateSelector x:Key="MyTemplateSelector" 
      IncidentTemplate="{StaticResource IncidentTemplate}" 
      ServiceTemplate="{StaticResource ServiceTemplate}" /> 

    </DataGrid.Resources> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="Typ" 
      CellTemplateSelector="{StaticResource MyTemplateSelector}" /> 

     ... 

    </DataGrid.Columns> 
</DataGrid> 
+0

感謝を!魅力的な作品! – Daniel

1

を使用することができますが動作しているようです:

<DataGrid> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="Typ"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ContentPresenter Content="{Binding}"> 
         <ContentPresenter.Resources> 
          <DataTemplate DataType="{x:Type models:IncidentModel}"> 
           <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/Active_16.png" /> 
          </DataTemplate> 
          <DataTemplate DataType="{x:Type models:ServiceModel}"> 
           <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/IncidentMgmt_AllIncidents_16.png" /> 
          </DataTemplate> 
         </ContentPresenter.Resources> 
        </ContentPresenter> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 
関連する問題