WPF技术问题:窗口代码后置访问公共字段类型及集合合并
针对你的两个WPF问题的解决方案
嘿,我来帮你搞定这两个WPF相关的问题,咱们逐个来梳理:
问题一:在ToCollectionWindow.xaml.vb中访问公共字段的类型
要获取公共字段(比如你的myCollection)的类型,其实很简单,你可以直接利用VB.NET的GetType()方法或者对象的实例方法:
- 获取字段的实际运行时类型:如果是已经实例化的字段(比如
myCollection已经New过了),直接调用它的实例方法:
' 在InitYo方法或者其他代码块里都可以用 Dim collectionType As Type = myCollection.GetType() ' 输出类型全名(示例) Console.WriteLine(collectionType.FullName) ' 会输出类似 System.Collections.ObjectModel.ObservableCollection`1[YourNamespace.Person] 的内容
- 获取静态类型(不依赖实例):如果你只是想知道
ObservableCollection(Of Person)这个类型本身,不需要实例,直接用GetType()关键字:
Dim staticType As Type = GetType(ObservableCollection(Of Person))
另外,如果你想获取TheCollection属性的类型,也可以用同样的方式,比如TheCollection.GetType(),因为它返回的就是ObservableCollection(Of Person)实例。
问题二:合并TheCollection与XAML中定义的GreekHeroesData集合
首先要明确:XAML中定义的集合通常会作为资源存在(比如在Window的<Resources>标签里),所以第一步是先把这个集合从资源中取出来,再合并到TheCollection里。
步骤1:获取XAML中的GreekHeroesData集合
假设你的XAML是类似这样定义的:
<Window.Resources> <local:ObservableCollection x:Key="GreekHeroesData"> <local:Person Name="Hercules"/> <local:Person Name="Achilles"/> </local:ObservableCollection> </Window.Resources>
那在代码后置里,你可以这样获取它:
' 从Window资源中取出集合,注意类型转换要匹配 Dim greekHeroesCollection = TryCast(Me.Resources("GreekHeroesData"), ObservableCollection(Of Person))
步骤2:合并两个集合
因为ObservableCollection本身没有内置的AddRange方法,所以有两种方式实现合并:
方式一:循环逐个添加(简单直接)
If greekHeroesCollection IsNot Nothing Then For Each hero In greekHeroesCollection ' 把XAML里的元素添加到TheCollection中 TheCollection.Add(hero) Next End If
方式二:写一个扩展方法实现AddRange(更简洁)
如果需要频繁合并集合,建议写一个扩展方法,以后复用更方便:
' 新建一个模块存放扩展方法 Imports System.Collections.ObjectModel Imports System.Collections.Generic Module ObservableCollectionExtensions <Extension()> Public Sub AddRange(Of T)(ByVal targetCollection As ObservableCollection(Of T), ByVal itemsToAdd As IEnumerable(Of T)) For Each item In itemsToAdd targetCollection.Add(item) Next End Sub End Module
然后在代码里就可以这样用:
If greekHeroesCollection IsNot Nothing Then TheCollection.AddRange(greekHeroesCollection) End If
注意:一定要加IsNot Nothing的判断,避免XAML资源不存在或者类型转换失败导致空引用异常。
内容的提问来源于stack exchange,提问作者Altiano Gerung
相关产品推荐
相关产品推荐

