2013-02-20 76 views
1

我有一个将List绑定到DataGrid的问题。WPF C#DataGrid绑定不同类型的列表

我想要的是具有柱呈现不同的类型,如:

[属性1] [字符串]

[属性2] [BOOL]

[属性3] [枚举]

我的实现看起来是这样的:

public interface IPropertyItem 
{ 
} 

public class PropertyItem<T> : IPropertyItem 
{ 
    public String Name { get; set; } 
    public T Value { get; set; } 
} 

创建一个列表来存储这些属性:

List<IPropertyItem> PropertyList { get; set; } 

并绑定到数据网格:

dataGrid.ItemsSource = PropertyList; 

现在的问题是,在第2列的所有单元格呈现出不同的数据类型为文本。

但我想要的是有布尔变量对枚举等

我真的很感激任何帮助,这一个复选框,组合框。这个问题已经持续了好几天了。

谢谢!

- UPDATE -

添加一个DataTemplateSelector解决了这个问题。

回答

0

您可以使用允许定义单元格模板的DataGridTemplateColumn。它的CellTemplateSelector属性有助于定义多个模板,并根据内容的类型使用一个模板。你必须为此编写自定义DataTemplateSelector,但它很简单。

+0

DataTemplateSelector正是我所期待的! – Ivarsson 2013-02-20 11:35:09

1

所以你在寻找DataTemplateSelector

例子:

<local:DynamicTemplateSelector x:Key="MyTemplateSelector" /> 

<DataTemplate x:Key="StringTemplate"> 
    <TextBlock> 
    <Run Text="String: " /> 
    <Run Text="{Binding}" /> 
</TextBlock> 

<DataTemplate x:Key="Int32Template"> 
<TextBlock> 
    <Run Text="Int32: " /> 
    <Run Text="{Binding}" /> 
</TextBlock> 

<Style x:Key="MyListStyle" TargetType="ListView"> 
<Setter Property="ItemTemplateSelector" Value="{StaticResource MyTemplateSelector}"/> 
<Setter Property="local:DynamicTemplateSelector.Templates"> 
    <Setter.Value> 
     <local:Templates> 
      <local:Template Value={x:Type String} DataTemplate={StaticResource StringTemplate}/> 
      <local:Template Value={x:Type Int32} DataTemplate={StaticResource Int32Template}/> 
     </local:Templates> 
    </Setter.Value> 
</Setter> 

+0

非常感谢您的帮助! – Ivarsson 2013-02-20 11:36:10

0

你可以做到这一点下面的步骤。

1)您需要为集合中的每种类型定义DataTemplate。
2)您可以根据类型在DataTrigger中分配模板,也可以使用DataTemplateSelector

希望它有帮助。

+0

是的,问题解决了。谢谢! – Ivarsson 2013-02-20 11:35:50