2

我在将列表绑定到 DataGrid 时遇到问题。

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

[属性 1] [字符串]

[属性 2] [布尔]

[属性 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;

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

但我想要的是有一个用于布尔值的复选框,用于枚举的组合框等。

我真的很感激这方面的任何帮助。被这个问题困扰了好几天了。

谢谢!

- 更新 -

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

4

3 回答 3

1

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

于 2013-02-20T10:17:51.847 回答
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>

于 2013-02-20T10:20:58.587 回答
1

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

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

希望能帮助到你。

于 2013-02-20T10:21:05.347 回答