从XAML传递原始类型作为参数

本文关键字:参数 类型 原始 XAML | 更新日期: 2023-09-27 18:05:25

TL;DR -我在Silverlight中将系统类型作为值传递给Type参数时遇到了问题。这是什么已知的问题吗?这可能吗?

在细节

:
在我的控件中,我有一个类型为Type的依赖属性。并且存在从System命名空间传递类型的问题,如int(Int32), string(String), Guid, decimal(Decimal), bool(Boolean)。在这些情况下,依赖属性接收null值(依赖属性默认值被设置为一些非空值,所以我在OnPropertyChanged事件中看到null被传递)。对于其他类型,它可以正常工作。

下面是我的依赖属性的代码:
public static readonly DependencyProperty SomeTypeProperty = DependencyProperty.Register(
    "SomeType", typeof(Type), typeof(Control1), new PropertyMetadata(typeof(EmptyType), OnSomeTypePropertyChanged));
public Type SomeType
{
    get { return (Type)GetValue(SomeTypeProperty); }
    set { SetValue(SomeTypeProperty, value); }
}

和控件的用法:

xmlns:sys="clr-namespace:System;assembly=mscorlib"
[...]
<sl1:Control1 SomeType="sys:Boolean" />

有趣的是-它在Visual Studio的XAML设计器中工作。通过在Control1控件的内容中显示属性值,也就是传递的Type,我知道这一点。

从XAML传递原始类型作为参数

我不知道为什么会这样…但是,这里有一个解决方法…

  1. 创建以下类:

    public class TypeOfRes
    {
        public object Object { get; set; }
        public Type TypeOf
        {
            get { return Object == null ? null : Object.GetType(); }
        }
    }
    
  2. 在您的页面中创建以下资源:

    <local:TypeOfRes x:Key="booleanRes">
        <local:TypeOfRes.Object>
            <sys:Boolean>True</sys:Boolean>
        </local:TypeOfRes.Object>
    </local:TypeOfRes>
    
  3. 在属性中引用资源:

    <local:SilverlightControl1 MyType="{Binding Source={StaticResource booleanRes},Path=TypeOf}"/>