如何仅用XAML语法将x:DataType设置为带泛型参数的类型?
如何仅用XAML语法将x:DataType设置为带泛型参数的类型?
嘿,这个场景我太熟悉了!你说的是要在XAML里给元素的x:DataType指定Lazy<MyType>这种带泛型参数的类型对吧?我之前也踩过同样的坑,先确认你遇到的问题确实很典型,然后给你说纯XAML的解决办法:
我试过的方法(和你遇到的一样)
- 直接写
x:DataType="a:Lazy"肯定不行,因为没指定泛型参数,XAML解析器根本认不出你要的是Lazy<T>,只会报错说找不到a:Lazy或者类型参数数量不对。 - 想当然写
a:Lazy<b:MyType>也没用,XAML会把<b:MyType>当成嵌套标签,完全不是你要的泛型参数意思。
不可行的解决方案(确实不太合适)
我也想过要不要在ViewModel里套个自定义类型,比如写个public class LazyMyType : Lazy<MyType>,这样XAML里直接用这个包装类就行。但正如你说的,一来改ViewModel可能没权限,二来这种写法确实有点别扭,把原类型的泛型信息给藏起来了,不太优雅。
纯XAML的解决方案!
其实XAML本身就支持指定带泛型参数的类型,关键是要用x:Type结合x:TypeArguments属性来写,具体步骤如下:
首先确保你已经在XAML的根元素里声明了对应的命名空间,比如:
<!-- 假设Lazy<T>在System命名空间,根据你的框架可能需要调整程序集 --> xmlns:a="clr-namespace:System;assembly=System.Runtime" <!-- MyType所在的命名空间 --> xmlns:b="clr-namespace:你的MyType所在命名空间"
然后在需要设置x:DataType的元素上,这么写:
<YourElement x:DataType="{x:Type TypeName=a:Lazy, x:TypeArguments={x:Type b:MyType}}"> <!-- 你的元素内容 --> </YourElement>
简单解释下:x:Type是用来引用具体类型的标记,而x:TypeArguments就是专门给泛型类型指定参数的属性,这样XAML解析器就能准确识别出你要的是Lazy<MyType>,不会再把泛型参数当成标签处理啦。
另外要注意,不同XAML框架(比如WPF、UWP、WinUI)里,System命名空间的程序集引用可能略有差异,但核心的x:Type+x:TypeArguments写法是通用的,你可以根据自己的项目调整命名空间的程序集部分。
备注:内容来源于stack exchange,提问作者Josh Brunton
相关产品推荐
相关产品推荐

