Передача примитивного Типа в качестве параметра из XAML

1

TL; DR - У меня проблема с прохождением системных типов в качестве значения для параметра "Тип" в Silverlight. Это какая-то известная проблема? Это вообще возможно?

Подробно:
В моем управлении у меня есть свойство зависимости типа Type. И есть проблема с передачей типов из пространства имен System, таких как int(Int32), string(String), Guid, decimal(Decimal), bool(Boolean). В этих случаях свойство depencency получает null значение (значение по умолчанию для свойства depencency устанавливается на некоторое непустое значение, поэтому я вижу в событии 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" />

Что интересно - он работает в дизайне XAML в Visual Studio. Я знаю это, отображая значение свойства, поэтому переданный тип в моем контрольном содержимом Control1. Но в среде выполнения Silverlight он не работает.

Теги:
xaml
silverlight

1 ответ

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}"/>
    
  • 0
    Я знаю, что есть несколько обходных путей, включая объявление ресурсов для каждого типа, который я хотел бы использовать, однако мне просто любопытно, почему это происходит? И возможно ли это сделать красивым, чистым способом - так, не анализируя типы из их имен, обрабатывая отдельно каждый проблемный тип и т. Д.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню