XAML Автоматическое преобразование типов - PullRequest
3 голосов
/ 09 мая 2011

Я заметил, что можно вернуть строку типа "Visible", "Collapsed", "Images / xyz.png" или "# FFB3D1" из преобразователя значений, и магия привязок удастся выяснить это.Скрыть / показать элемент пользовательского интерфейса, найти изображение xyz.png или раскрасить что-нибудь розовым ...

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

Объяснение:

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

// PseudoCode from my MarkupExtension, setting up & 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 +, он пропускает шаггде-то в 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 );
        }

Это просто случай применения преобразователя типов вручную

Ответы [ 2 ]

3 голосов
/ 09 мая 2011

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

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

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

1 голос
/ 09 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...