NotifyCollectionChangedEventArgs 项目不可访问
NotifyCollectionChangedEventArgs Item Inaccessible
我有一个 ObservableCollection<T>
对象的 CollectionChanged
事件的处理程序,但不知道如何使用 NotifyCollectionChangedEventArgs
检索 [=14= 中包含的项目] 参加活动。
添加到集合中的新项目在 NewItems
属性,一个 IList
对象中。 Intellisense 不允许我访问 .Item[Index]
(根据文档我应该可以访问),也不能将 NewItems
列表转换为局部变量(根据 debug the NewItems
list是一个 System.Collections.ArrayList.ReadOnlyList
,它在 MSDN 中似乎不作为可访问的 class 存在。)
我做错了什么?
示例:
private void ThisCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Item I = e.NewItems._________;//<<<<<cannot access any property to get the item
var j = e.NewItems;//System.Collections.ArrayList.ReadOnlyList, see if you can find in the MSDN docs.
IList I1 = (IList) e.NewItems;//Cast fails.
IList<Item> = (IList<Item>)e.NewItems.________;//<<<<<<<Can't make this cast without an IList.Item[Index] accessor.
var i = j[0]; //null
var ioption = j.Item[0]; //no such accessor
string s = (string)i; //null
}
此示例尽可能保持通用,但仍然失败。
没有一个好的 Minimal, Complete, and Verifiable code example 就不可能准确地说出你需要做什么。但与此同时,让我们尝试至少从您发布的代码中澄清您的一些误解:
private void ThisCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Item I = e.NewItems._________;//<<<<<cannot access any property to get the item
var j = e.NewItems;//System.Collections.ArrayList.ReadOnlyList, see if you can find in the MSDN docs.
IList I1 = (IList) e.NewItems;//Cast fails.
IList<Item> = (IList<Item>)e.NewItems.________;//<<<<<<<Can't make this cast without an IList.Item[Index] accessor.
var i = j[0]; //null
var ioption = j.Item[0]; //no such accessor
string s = (string)i; //null
}
NotifyCollectionChangedEventArgs.NewItems
is a property, with the type IList
,非泛型接口。此接口与 NewItems
属性 相关的两个关键方面是您可以获得 Count
项,并且可以索引列表。索引列表 returns 和 object
;将其转换为适当的类型取决于您。
System.Collections.ArrayList.ReadOnlyList
在框架中是私有的 class。你不打算直接使用它。 NewItems
属性 returns 只是 IList
的实现。这个实现的重要之处在于它是只读的。不支持 IList
成员,例如 Add()
、Insert()
和 Remove()
。你所能做的就是把物品拿出来。但同样重要的是,就您的代码而言,唯一重要的类型是 IList
。您不能直接访问私有类型的成员;它们只能通过它们实现的 public 接口使用。
- 你没有具体说明"Cast fails"是什么意思。这是难以置信的,因为
NewItems
属性 已经是 IList
类型了。转换为 IList
会很容易成功。
- 是真的,您不能将
IList
转换为通用 IList<Item>
。您正在处理的 IList
的实现是私有的 class System.Collections.ArrayList.ReadOnlyList
,它不可能实现通用的 IList<Item>
接口。毕竟,ReadOnlyList
是 Microsoft 编写的,并且在 .NET 框架中。他们怎么知道你的 Item
类型?
- 您不打算显式使用对象的
Item
属性 索引器。这作为隐藏成员存在。相反,您应该使用内置的 C# 语法来索引对象本身。 IE。 e.NewItems[0]
或 j[0]
.
- 一旦您将
null
分配给变量 i
,再多的转换也不会将该 null
值更改为其他值。不是 string
,不是其他类型。
您已经尝试了很多不同的方法,其中大部分都毫无意义,所以它们不起作用也就不足为奇了。您得到的最接近的是 j[0]
表达式。但是你可以直接使用 e.NewItems
。您的代码应该更像这样:
private void ThisCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// Assumes that the elements in your collection are in fact of type "Item"
Item item = (Item)e.NewItems[0];
// do something with "item"
}
但是,请务必注意,您需要先检查集合发生了何种变化。如果实际上没有任何新项目,NewItems
列表可能是空的。如果新设置的项目值实际上是 null
,则列表的元素可能是 null
。您能否成功地将非空元素值转换为 Item
取决于 Item
实际在此处,以及您的集合中是否真的包含该类型的元素。同样,您尝试转换为 string
。如果列表不包含 string
类型的元素,则将任何非 null 元素值转换为 string
是行不通的。
但这些都是代码其余部分特有的问题。你没有提供,所以我能做的最好的就是尝试用一般术语解释你目前似乎误解了这个事件及其支持类型如何工作的所有方式。
我有一个 ObservableCollection<T>
对象的 CollectionChanged
事件的处理程序,但不知道如何使用 NotifyCollectionChangedEventArgs
检索 [=14= 中包含的项目] 参加活动。
添加到集合中的新项目在 NewItems
属性,一个 IList
对象中。 Intellisense 不允许我访问 .Item[Index]
(根据文档我应该可以访问),也不能将 NewItems
列表转换为局部变量(根据 debug the NewItems
list是一个 System.Collections.ArrayList.ReadOnlyList
,它在 MSDN 中似乎不作为可访问的 class 存在。)
我做错了什么?
示例:
private void ThisCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Item I = e.NewItems._________;//<<<<<cannot access any property to get the item
var j = e.NewItems;//System.Collections.ArrayList.ReadOnlyList, see if you can find in the MSDN docs.
IList I1 = (IList) e.NewItems;//Cast fails.
IList<Item> = (IList<Item>)e.NewItems.________;//<<<<<<<Can't make this cast without an IList.Item[Index] accessor.
var i = j[0]; //null
var ioption = j.Item[0]; //no such accessor
string s = (string)i; //null
}
此示例尽可能保持通用,但仍然失败。
没有一个好的 Minimal, Complete, and Verifiable code example 就不可能准确地说出你需要做什么。但与此同时,让我们尝试至少从您发布的代码中澄清您的一些误解:
private void ThisCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Item I = e.NewItems._________;//<<<<<cannot access any property to get the item
var j = e.NewItems;//System.Collections.ArrayList.ReadOnlyList, see if you can find in the MSDN docs.
IList I1 = (IList) e.NewItems;//Cast fails.
IList<Item> = (IList<Item>)e.NewItems.________;//<<<<<<<Can't make this cast without an IList.Item[Index] accessor.
var i = j[0]; //null
var ioption = j.Item[0]; //no such accessor
string s = (string)i; //null
}
NotifyCollectionChangedEventArgs.NewItems
is a property, with the typeIList
,非泛型接口。此接口与NewItems
属性 相关的两个关键方面是您可以获得Count
项,并且可以索引列表。索引列表 returns 和object
;将其转换为适当的类型取决于您。System.Collections.ArrayList.ReadOnlyList
在框架中是私有的 class。你不打算直接使用它。NewItems
属性 returns 只是IList
的实现。这个实现的重要之处在于它是只读的。不支持IList
成员,例如Add()
、Insert()
和Remove()
。你所能做的就是把物品拿出来。但同样重要的是,就您的代码而言,唯一重要的类型是IList
。您不能直接访问私有类型的成员;它们只能通过它们实现的 public 接口使用。- 你没有具体说明"Cast fails"是什么意思。这是难以置信的,因为
NewItems
属性 已经是IList
类型了。转换为IList
会很容易成功。 - 是真的,您不能将
IList
转换为通用IList<Item>
。您正在处理的IList
的实现是私有的 classSystem.Collections.ArrayList.ReadOnlyList
,它不可能实现通用的IList<Item>
接口。毕竟,ReadOnlyList
是 Microsoft 编写的,并且在 .NET 框架中。他们怎么知道你的Item
类型? - 您不打算显式使用对象的
Item
属性 索引器。这作为隐藏成员存在。相反,您应该使用内置的 C# 语法来索引对象本身。 IE。e.NewItems[0]
或j[0]
. - 一旦您将
null
分配给变量i
,再多的转换也不会将该null
值更改为其他值。不是string
,不是其他类型。
您已经尝试了很多不同的方法,其中大部分都毫无意义,所以它们不起作用也就不足为奇了。您得到的最接近的是 j[0]
表达式。但是你可以直接使用 e.NewItems
。您的代码应该更像这样:
private void ThisCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// Assumes that the elements in your collection are in fact of type "Item"
Item item = (Item)e.NewItems[0];
// do something with "item"
}
但是,请务必注意,您需要先检查集合发生了何种变化。如果实际上没有任何新项目,NewItems
列表可能是空的。如果新设置的项目值实际上是 null
,则列表的元素可能是 null
。您能否成功地将非空元素值转换为 Item
取决于 Item
实际在此处,以及您的集合中是否真的包含该类型的元素。同样,您尝试转换为 string
。如果列表不包含 string
类型的元素,则将任何非 null 元素值转换为 string
是行不通的。
但这些都是代码其余部分特有的问题。你没有提供,所以我能做的最好的就是尝试用一般术语解释你目前似乎误解了这个事件及其支持类型如何工作的所有方式。