【问题标题】:Binding MVVM with (only) some columns autogenerated from a collection将 MVVM 与(仅)从集合中自动生成的某些列绑定
【发布时间】:2011-04-20 15:01:40
【问题描述】:

我有一组要绑定到 RadGridView 的对象(来自工具包 telerik)。对象的类看起来像这样(需要理解的最少代码),其中我有 1 个属性和 1 个值数组:

public class AttributeEntry : INotifyPropertyChanged
    {
        public string Code { get; set; }
        private string[] _values;
        public string[] Values
        {
            get { return _values; }
            set { _values = value; }
        }
        public string this[int index]
        {
            get { return _values[index]; }
            set
            {
                _values[index] = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(Binding.IndexerName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

有人知道一种(简单的)方法,使用模式 MVVM,有一个 RadGridView 定义了一些列(在我的情况下对应于“代码”属性)和一些列“自动生成”,每列对应于元素集合(在我的情况下是数组“值”的元素。如果我的集合中有 7 个值,我应该有 7 个“自动生成”列)?

【问题讨论】:

  • Values 中的元素数量是动态的吗?
  • 没有。所有 AttributeEntry 对象将在 Values 数组中具有相同数量的元素。它是使用应用程序配置参数定义的(目前是 150 个值,但明天可能会改变......)

标签: c# wpf mvvm telerik radgridview


【解决方案1】:

我假设您将RadGridView 绑定到AttributeEntry 的集合。

在这种情况下,请在您的收藏中实现 ITypedList。您可以使用ITypedList 返回虚拟PropertyDescriptor,其GetValueSetValue 方法使用数组

【讨论】:

    【解决方案2】:

    对于任何尝试实现此功能的人,请将您的类声明为 expandoobject,这是一个灵活的类结构,实现了 INotifyPropertyChanged,您可以根据代码中的要求定义属性。

    在 Telerik raddatagrid 上,将 itemsource 绑定到 expandoobjects 的集合,并将 AutoGenerateColumns 设置为 true。

    如果您想根据 expandoobject 的内容定制列,则使用 AutoGeneratingColumn 事件,该事件会在每个列生成时触发,如果您将列控件定义为数据模板,您可以在后面的代码中访问它们并分配它们单元格模板也是如此。

    【讨论】:

      【解决方案3】:

      不确定RadGridView,但对于普通的DataGrid,您可以将AutoGenerateColumns 属性设置为true 以根据其数据绑定自动生成列,或者将false 设置为根据您的代码创建列.

      在您的情况下,我认为您必须将 AutoGenerateColumns 属性设置为 false 并自己定义列以结合两者(集合的元素和 Code 属性)。 p>

      编辑:

      刚刚检查了MSDN

      显式声明的列字段可以 结合使用 自动生成的列字段。 当两者都使用时,显式 呈现声明的列字段 首先,其次是自动 生成的列字段。

      【讨论】:

      • 是的,这是我首先想到的。我已经尝试过这个解决方案,但是:
      • 是的,这是我首先想到的。我已经尝试过这个解决方案,但是: 1. 它不是很符合 MVVM :( 2. 我没有找到原因,但是“值”集合的第一个值没有显示……看来绑定是在受影响的值(对于第一个值)不应该是这种情况!
      • 我认为@Bolu 的方向是正确的,但并非一直如此。 AttributeEntry 对象看起来像是一些其他具体数据源的奇怪转换。如果数据的基础源返回具有所有这些属性的对象,则 RadGridView 的自动生成列将按照设计的方式工作,并自动为每个属性创建一个列。源数据真的是非结构化的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 2013-04-15
      • 2014-05-04
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多