【问题标题】:How to bind dynamic data?如何绑定动态数据?
【发布时间】:2014-02-23 11:02:45
【问题描述】:

我有一组包含 3000 多个字段的数据。 我不想为每个字段手动创建一个类和属性。

有没有一种方法可以创建动态对象行并将它们绑定到列表。

我尝试过的一切都失败了,我不确定是否可以使用绑定。

有趣的是,有人将问题记下来但没有人知道解决方案。

【问题讨论】:

  • 作为用户,我可以预见在显示 3000 列宽的信息表时会出现一些问题。我与一些只有几百人的公司合作,我认为他们太过分了。
  • 好的,它是一个“轻微的缩写”,确切地说更像是 186 个字段,但我不想创建一个具有 186 个属性的类。
  • 现在数据是什么格式的?
  • 我所做的是从数据库中选择所有必填字段,然后解析一些分隔字符串来构造数据。所以每一行都是一个字符串数组。
  • ExpandoObject 在这里有帮助吗?还是一个自定义实现?

标签: c# wpf gridview binding datagrid


【解决方案1】:

我在动态构建的表中也遇到过同样的问题。通过一些研究,我想出了一个能够处理不同数量领域的解决方案。它由两个类组成。

首先有一个属性类,把它看成表格中的一列。

 public class Property
{
    public string Name { get; private set; }//field name
    public object Value { get; set; }//value
    public Type DataType { get; private set; }//datatype if needed
}

然后,您有一个记录类 - 它本质上是一个属性对象的集合。看看这是表格中的单行。

public class Record : INotifyPropertyChanged
{      
    private ObservableCollection<Property> _Properties;
    public ObservableCollection<Property> Properties
    {
        get { return _Properties; }
        set
        {
            _Properties = value;
            OnPropertyChanged("Properties");
        }
    }

    public Record(List<Property> properties)
    {
        _Properties = new ObservableCollection<Property>();

        foreach (var property in properties)
            _Properties.Add(property);
    }

    public Record(List<Property> properties)
    {
        _Properties = new ObservableCollection<Property>();            

        foreach (var property in properties)
            _Properties.Add(property);
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    //protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
    //{
    //    PropertyChangedEventHandler handler = this.PropertyChanged;
    //    if (handler != null)
    //    {
    //        handler(this, args);
    //    }
    //}

}    

然后,您可以将这个本质上是 Records 集合的东西绑定到您需要的任何控件或项目。

【讨论】:

  • 你有两次相同的ctor。请发布一个示例,说明如何将记录集合绑定到控件。控件如何知道构建列?
  • 我绑定了它,但它只是给了我每行的 [Collections] 名称列表,而不是实际结果。
  • 我刚刚给了你框架......这有点取决于你的业务领域,你如何获取数据,你用它做什么。
  • 抱歉,不知道它在这个实例或动态绑定中的任何实例中是如何工作的。
【解决方案2】:

您说您使用了我的评论并发布。

我现在无法访问代码,但对于 GridView,我使用一个 List,然后在 ctor 中为每一列创建为 GridViewColumn 并将其绑定到 string[i]。或者您可以使用 DataTable 和 DataGrid。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多