Автоматическое преобразование типов в XAML

#c# #.net #wpf #xaml

#c# #.net #wpf #xaml

Вопрос:

Я заметил, что из преобразователя значений можно возвращать строку типа «Видимая», «Свернутая», «Изображения / xyz.png» или «#FFB3D1», и магия привязок позволяет это вычислить. Скройте / покажите элемент пользовательского интерфейса, найдите изображение в формате xyz.png или покрасьте во что-нибудь розовое…

Я долгое время принимал это как должное, теперь это не работает с моим последним кодом, поэтому мой вопрос в том, как я могу вручную вызвать эту функциональность?


Объяснение:

Я расширил масштаб, создав пользовательскую MarkupExtension, которая подключает мультиконвертер, присоединяет его к MultiBinding и возвращает инициализированную привязку. Однако, когда этот мультиконвертер возвращает строки типа «#FFB3D1» или «Red», кажется, ничего не происходит.

 // PseudoCode from my MarkupExtension, setting up amp; returning the binding/multi-converter
public override object ProvideValue( IServiceProvider serviceProvider )
{
    MultiBinding outputBinding = new MultiBinding();    
    foreach ( Binding b in bindings )
    {
        outputBinding.Bindings.Add( b );
    }    

    outputBinding.Converter = converter;
    return outputBinding.ProvideValue( serviceProvider );
}
  

Я предполагаю, что, поскольку я создаю Multibinding Converter в коде, он пропускает шаг где-то в Binding.Magic пространстве имен.


Решение:

     public override object ProvideValue( IServiceProvider serviceProvider )
    {
        // get targets
        IProvideValueTarget serv = (IProvideValueTarget)serviceProvider.GetService( typeof( IProvideValueTarget ) );

        // get Type Converter
        object[] typeConverterAttributes = ( (DependencyProperty)serv.TargetProperty ).PropertyType.GetCustomAttributes( typeof( TypeConverterAttribute ), true );
        TypeConverter typeConverter = null;

        if ( typeConverterAttributes.Length > 0 )
        {
            TypeConverterAttribute attr = (TypeConverterAttribute)typeConverterAttributes[0];
            typeConverter = (TypeConverter)Activator.CreateInstance( Type.GetType( attr.ConverterTypeName ), false );
        }
  

Тогда это просто случай применения преобразования типов вручную

Комментарии:

1. Атрибут TypeConverter также может быть объявлен в типе свойства, например, в самом классе Brush. Возможно, вы захотите, чтобы ваш код проверял и там.

Ответ №1:

Волшебство, на которое вы ссылаетесь, связано с использованием в фреймворке TypeConverter атрибута.

Если это ваше собственное свойство, к которому вы привязываетесь, возможно, вам следует определить новый TypeConverter и украсить свойство атрибутом TypeConverter.

http://blogs.windowsclient.net/rob_relyea/archive/2008/04/10/strings-to-things-or-how-xaml-interprets-attribute-values.aspx

Ответ №2:

Может быть, вы можете попробовать BrushConverter.