Как создать свойство зависимости типа Type и назначить его в XAML? - PullRequest
4 голосов
/ 15 марта 2010

Я хотел бы знать, как я могу назначить в XAML свойство зависимости типа Type в Silverlight, поскольку расширение разметки {x: Type} не существует?

Спасибо

Ответы [ 2 ]

3 голосов
/ 15 марта 2010

В зависимости от ваших требований может быть несколько разных подходов. Следующее является очень общим решением.

Создать преобразователь значения, который преобразует строку в тип: -

public class StringToTypeConverter : IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Type.GetType((string)value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Поместите экземпляр этого конвертера в словарь ресурсов, объект назначения которого имеет видимость, например, App.xaml: -

    <Application.Resources>
        <local:StringToTypeConverter x:Key="STT" />
    </Application.Resources>

Теперь в вашем Xaml вы можете присвоить значение такому свойству: -

 <TextBox Text="{Binding Source='System.Int32,mscorlib', Converter={StaticResource STT}}" />
2 голосов
/ 25 января 2011

Другой подход заключается в украшении самого свойства с помощью преобразователя типов.

Определите TypeConverter следующим образом:

public class StringToTypeConverter : TypeConverter
{
   public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
   {
     return sourceType.IsAssignableFrom(typeof (string));
   }

   public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
   {
      var text = value as string;
      return text != null ? Type.GetType(text) : null;
   }
}

Украсьте свою собственность так:

[TypeConverter(typeof(StringToTypeConverter))]
public Type MessageType
{
    get { return (Type) GetValue(MessageTypeProperty); }
    set { SetValue(MessageTypeProperty, value); }
}

И тогда в вашем XAML вы можете сделать это:

<MyObject MessageType="My.Fully.Qualified.Type"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...