【问题标题】:Use a DataGrid as an ItemsControl in WPF在 WPF 中使用 DataGrid 作为 ItemsControl
【发布时间】:2012-07-26 02:52:21
【问题描述】:

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

为了给你一个问题的例子,这里有一些基本类及其属性列表。
类型必须是文本、音频或视频之一。
文本 - 名称、类型、描述、长度、作者
音频 - 名称、类型、描述、长度、文件格式、曲目编号、艺术家、专辑等
视频 - 名称、类型、描述、长度、文件格式、曲目编号、艺术家等。

如您所见,每个字段都略有不同。选择类型后,它会更改用户输入的可用属性。不要太拘泥于课程和方法,因为课程只是一个例子。用户要求数据采用类似网格的格式以提高可读性。对于大多数用户数据,DataGrid 中的条目之间只有一两条信息会发生变化,因此能够扫描并发现属性的变化非常重要。

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

【问题讨论】:

  • 你见过this page 吗?这可能会有所帮助。

标签: c# wpf datagrid datatemplate


【解决方案1】:

只需制作一个包装类以显示在数据网格中。

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 中,在您的数据网格中创建模板列:

<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>

就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2014-08-03
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多