在WPF中使用DataGrid作为ItemsControl

时间:2012-07-26 02:52:21

标签: c# wpf datagrid datatemplate

我正处于允许用户创建,修改和删除集合中项目的应用程序的开发阶段。集合中的项目将具有不同的属性,并允许根据项目类型的选择为这些属性提供输入。

为了举例说明问题,这里有一些基本类及其属性列表 类型必须是文本,音频或视频之一 文本 - 名称,类型,描述,长度,作者
音频 - 名称,类型,描述,长度,FileFormat,曲目#,艺术家,专辑等 视频 - 名称,类型,描述,长度,FileFormat,Track#,艺术家等。

如您所见,每个字段的字段略有不同。选择“类型”后,它会更改用户输入的可用属性。不要太沉迷于类和方法,因为类只是一个例子。用户请求数据采用类似网格的格式以便于阅读。对于大多数用户的数据,DataGrid中的条目之间只会有一两条信息发生变化,因此扫描和查找属性变化的能力非常重要。

WPF设计的最佳方法是什么?
可以将不同的项目转换为单个数据网格控件吗? 一旦选择了类型,我能将通用项目转换为特定项目吗?

1 个答案:

答案 0 :(得分:0)

只需创建一个在数据网格中显示的包装类。

public class Wrapper
{
    public TypeEnum Type { get; set; }
    public string Name { get; set; }
    // other common props
    public string CustomProperty1 { get; set; }

    public object ConvertToRealObject()
    {
        switch(this.Type)
        {
            case TypeEnum.Audio:
                return new Audio { Name = this.Name, Album = this.CustomProperty1 }
            /* other type handling */
        }
    }
}

在XAML中,在datagrid中创建模板列:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock x:Name="tb" Text="{Binding CustomProperty1}" Visibility="Collapsed" />
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Type}" Value="Audio">
                    <Setter Target="tb" Property="Visibility" Value="Visible" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

就是这样。

相关问题