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

时间:2014-05-27 10:59:09

标签: c# .net silverlight xaml

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

详情:
在我的控制中,我有类型Type的依赖属性。从System命名空间传递类型存在问题,例如int(Int32)string(String)Guiddecimal(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来了解这一点。但是在Silverlight运行时环境中它不起作用。

1 个答案:

答案 0 :(得分:0)

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

  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}"/>