WPF C#DataGrid绑定列表,具有不同的类型

时间:2013-02-20 10:07:57

标签: c# wpf binding types datagrid

我将List绑定到DataGrid时遇到问题。

我想要的是有一个列呈现不同的类型,例如:

[Property 1] [String]

[Property 2] [bool]

[Property 3] [enum]

我的实现如下:

public interface IPropertyItem 
{
}

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

我创建了一个List来存储这些属性:

List<IPropertyItem> PropertyList { get; set; }

并绑定到数据网格:

dataGrid.ItemsSource = PropertyList;

现在的问题是第二列中的所有单元格都将不同的数据类型显示为Text。

但我想要的是有一个bools的复选框,enob的复选框等。

我真的很感激任何帮助。几天来一直坚持这个问题。

谢谢!

- 更新 -

添加DataTemplateSelector解决了这个问题。

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以按照以下步骤执行此操作。

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

希望它有所帮助。