2015-11-17 40 views
0

在我的应用程序中,我有一个Window,其上有三个DataGrid s。所有DataGrid s应该有相同的柱子。不同来源的DataGridTemplateColumn

DataGrid中的两个被绑定到ObservableCollection<DisplayItem>。第三个DataGrid绑定到ObservableCollection<GeneralItem>

该类别GeneralItem有一个属性DisplayItem类型。

两三个DataGrid S中的DataGridTemplateColumn为项目名称的定义是这样的:

<DataGridTemplateColumn Width="Auto" Header="Item-Name"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
     <TextBlock Style="{StaticResource DataGridTextBlockStyle}" 
        Text="{Binding Module.DisplayItem.Text}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

第三DataGrid的该DataGridTemplateColumn为项目名称的定义是这样的:

<DataGridTemplateColumn Width="Auto" Header="Item-Name"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
     <TextBlock Style="{StaticResource DataGridTextBlockStyle}" 
        Text="{Binding Module.GeneralItem.DisplayItem.Text}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

我知道我可以制作DataGridTemplateColumn来资源并将它用作StaticResource s。

我现在想知道的是:有没有可能只写DataGridTemplateColumn一次,它可以处理这两种情况?例如通过向StaticResource提供一个DataContext等等。

回答

1

您可以创建一个模板选择器,让您选择使用哪个模板。

<Window.Resource> 
    <DataTemplate x:Key="FirstTemplate"> 
     <TextBlock Style="{StaticResource DataGridTextBlockStyle}" 
        Text="{Binding Module.DisplayItem.Text}"/> 
    </DataTemplate> 
    <DataTemplate x:Key="SecondTemplate"> 
     <TextBlock Style="{StaticResource DataGridTextBlockStyle}" 
        Text="{Binding Module.GeneralItem.DisplayItem.Text}"/> 
    </DataTemplate> 
</Window.Resource> 
<DataGridTemplateColumn Header="Item-Name"> 
    <DataGridTemplateColumn.CellTemplateSelector> 
     <local:DisplayItemTemplateSelector 
      FirstTemplate="{StaticResource FirstTemplate}" 
      SecondTemplate="{StaticResource SecondTemplate}"/> 
    </DataGridTemplateColumn.CellTemplateSelector> 
</DataGridTemplateColumn> 

public class DisplayItemTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate FirstTemplate 
    { get; set; } 

    public DataTemplate SecondTemplate 
    { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 

    if (item is GeneralItem) 
    { 
     //second template etc 
    } 
    else if (item is DisplayItem) 
    { 
     //first template 
    } 
    else 
     return base.SelectTemplate(item, container); 
    } 
}