Использование универсального IValueConverter из XAML - PullRequest
8 голосов
/ 29 апреля 2011

У меня есть универсальный класс, реализующий IValueConverter. Что-то вроде:

class MyValueConverter<T> : IValueConverter

С XAML 2009 я могу использовать его так:

<my:MyValueConverter x:TypeArguments='x:String'/>

Но, очевидно, это не разрешено для "скомпилированного" XAML (я думаю, нам придется подождать .NET 5)

Мой текущий метод обхода его подклассов для каждого использования:

class FooMyValueConverter : MyValueConverter<Foo>

Возможно ли сделать это в разметке только с использованием XAML 2006?

1 Ответ

6 голосов
/ 29 апреля 2011

Вы, вероятно, могли бы сделать это с помощью пользовательского MarkupExtension ( архив ) ( v4 ).Что-то вроде:

public class MyMarkupExtension : MarkupExtension {

    public MyMarkupExtension() {
        this.Type = /* some default type */;
    }

    public MyMarkupExtension(Type type) {
        this.Type = type;
    }

    public Type Type { get; private set; }

    public override object ProvideValue(IServiceProvider serviceProvider) {
        Type type = typeof(MyValueConverter<>).MakeGenericType(this.Type);
        return Activator.CreateInstance(type);
    }
}

Тогда вы будете использовать его как {Binding ... Converter={local:MyMarkup {x:Type BounceEase}}}

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