【问题标题】:Add property at run-time在运行时添加属性
【发布时间】:2012-09-16 01:46:29
【问题描述】:

我有一个List<Data>,其中:

class Data
{
   public string Name { get; set; }
}

我将此列表用作ListViewItemsSource

我的ListViewView 是一个GridView 和一个GridViewColumn(最初),我使用我的GridViewColumnDisplayMemberBinding 绑定属性Data.Name

在运行时可能我将新的GridViewColumn 添加到我的GridView,所以我需要将Datanew 属性绑定到这个新专栏。

我该怎么做?

【问题讨论】:

  • 你会绑定什么新属性?数据从哪里来?有种方法可以做到这一点,包括自定义 PropertyDescriptor 等 - 但要就“如何”提供建议,需要更多上下文。
  • @MarcGravell 例如新属性public string Surname{ get; set; }。数据可能来自文件。

标签: c# wpf listview gridview binding


【解决方案1】:

编辑:看来我误解了这个问题。如果您尝试将属性添加到 Data 类,那么我认为您不走运。如果您已经拥有该属性并且只是想将该现有属性绑定到GridView,那么下面的代码应该会有所帮助。

假设 GridView 的 DataContext 已经设置,您可以使用类似于 MSDN 的示例:

GridViewColumn gvc = new GridViewColumn();
gvc.DisplayMemberBinding = new Binding("Surname");
gvc.Header = "Surname";
gvc.Width = 100;
myGridView.Columns.Add(gvc);

【讨论】:

    【解决方案2】:

    不,您不能在运行时添加“常规”属性 - 坦率地说,您所描述的内容可能希望绑定到 DataTable,并将数据映射到其中。您可以在运行时执行此操作但它非常复杂。 DataTable 已经有了完整的实现。

    【讨论】:

    • 也许它很复杂,但我需要它。我可以在某处找到一些参考资料/示例吗?
    • @Nick 我在这里有一些关于 SO:你主要寻找的是 ITypedList - 以下是 winforms,但也应该在 wpf 中工作:stackoverflow.com/questions/4716092/…
    【解决方案3】:

    向数据实例添加实际属性的解决方案相当复杂,

    但也许这些解决方案之一就足够了

    你可以使用动态(更多细节在这里:dynamics

            dynamic dynamicData = new ExpandoObject();
            dynamicData.Name = "Name";
            dynamicData.Surname = "SomeSurname";
    

    如果你可以重建数据项的集合,你可以使用匿名类型(更多细节在这里anonymous types

            var data = new Data();
            string newPropertyName = "Surname";
            var data2 = new { Name = data.Name, newPropertyName = "SomeString" };
    

    除非您使用 DataTemplates 绑定到具体类型的数据。

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 2013-03-27
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多