4

我在另一个程序集中有一个 ListView 并想向它添加一列。列表视图中的项目是该程序集中某个类的对象。

当我添加这样的列时

var col : GridViewColumn = new GridViewColumn();
col.Header = "Header text";
list.View.Columns.Add(col);

该列出现,但列表视图中的所有行都具有该新列中项目类型的名称。即使我更改了新列 ( itemclass.Items[newColIdx] = "zz") 的值,它也不会显示。不涉及数据绑定或单元格模板。

这是为什么?

编辑:也许我可以加强这个问题:如果 ListView.Items 包含一个 A 类数组 - 你如何控制 A 的哪些东西在 GridView 中如何显示?我在这里需要逆向工程,DisplayMemberBinding 为空,因此它不使用数据绑定 AFAIK。

赏金问题ToString()在每个项目(代表一行)上调用时,它是如何映射到 GridView 的列的?我必须如何更改行中的项目以填充新列?

尝试找到此解决方案时的特殊问题是,它在更大的 C# .NET 应用程序中的 JScript 沙箱中运行,并且除了使用消息框和反射之外没有提供调试可能性。

编辑:问题是我正在编写一个在第 3 方 .NET 应用程序中运行的 JScript,它让我有机会用 .NET 做很多可能的事情。这是一个向列表视图添加功能的脚本。我可以访问列表视图,它由第 3 方应用程序填充数据库数据。我不知道它是怎么做到的。我可以以编程方式添加具有自定义内容的自定义行(与数据库无关)。但是当我添加一个自定义列时,我似乎无法在 den 行中设置它的值。

添加的行是一种类型3rdParty.ListRow,并包含一个属性Items,我为其分配了一个字符串数组。数组的值显示在代表列中 - 但不在添加的列中。在那里我只得到了3rdParty.ListRow因为ToString()在 ListRow 上被调用的文本。

那么:如何告诉新列(例如索引 5)显示ListRow.Items[5]而不显示ListRow.ToString()?我喜欢以与已经存在的列相同的方式执行此操作,似乎 Alex 提到的所有属性都在那里未定义。我将如何设置DataMemberBinding以实现映射到ListRow.Items[5]

4

2 回答 2

3

如果 column 没有,DisplayMemberBinding或者CellTemplate在网格中的每个项目上调用 ToString 并且评估值用作单元格内容。

例如,如果您有课程:

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public override string ToString()
    {
        return LastName;
    }
}

如果将集合绑定Person到网格视图:

var people =
    new List<Person>
    {
        new Person { FirstName = "Peter", LastName = "Smith" }, 
        new Person { FirstName = "Steve", LastName = "White" },
        new Person { FirstName = "Dave", LastName = "Gates" },
    };

listView1.ItemsSource = people;

如果您创建一个没有绑定的新列,则 LastName 将显示在该列中,因为覆盖ToString()返回LastName。如果您更改ToString为返回FirstName,则将显示新列FirstName

希望我正确理解了你的问题。

[编辑]

如果您添加了许多新列并且不使用DisplayMemberBinding,那么所有新列都将评估并显示ToString()结果。您需要设置DisplayMemberBinding为显示特定属性。

var newColumn = new GridViewColumn();
newColumn.Header = "Test";
newColumn.DisplayMemberBinding = new Binding("FirstName");
gridView.Columns.Add(newColumn);

[编辑] 回答您的问题:

当对每个项目(代表一行)调用 ToString() 时,它如何映射到 GridView 的列?我必须如何更改行中的项目以填充新列?

ToString 在单元格呈现器被渲染时被调用,除非你指定了绑定或模板,它最终也会使用绑定。您无法更改行项目以控制它在网格中的表示方式,除非您覆盖 ToString 或绑定到列的属性。

不确定我是否完全理解您的问题。您正在添加一个新列,对吗?为什么不在列上设置 DisplayMemberBinding 属性?如果您这样做,您将能够在列中显示您想要的任何内容。

[编辑]

我想我回答了你的赏金问题:)。我想我已经赢得了赏金:)。

但是,这是您下一个问题的答案:

如何设置 DataMemberBinding 以实现到 ListRow.Items[5] 的映射?

答案:

newColumn.DisplayMemberBinding = new Binding("Items[5]");
于 2011-05-04T03:16:50.957 回答
3

这是因为正在调用列表中每个项目的 ToString() 方法。如果没有被继承类型覆盖,Object.ToString() 返回对象的类型名称。

还有一个问题是您的列表不会引发更改事件,因此 UI 不知道数据已更改并需要刷新。

于 2011-03-07T10:22:37.840 回答