WPF: есть ли способ использовать ValueConverter без определения ресурса? - PullRequest
2 голосов
/ 19 июля 2010

Есть ли способ использовать ValueConverter, не определяя его в ресурсе? Так как синтаксис довольно многословен.

Ответы [ 4 ]

6 голосов
/ 19 июля 2010

Вы можете использовать MarkupExtension, чтобы минимизировать количество требуемого кода xaml.Например:

public class  MyConverter: MarkupExtension, IValueConverter

{частный статический MyConverter _converter;

public object Convert(object  value, Type targetType, 
object  parameter, System.Globalization.CultureInfo culture)
{
    // convert and return something
}

public object  ConvertBack(object value, Type  targetType, 
object parameter,  System.Globalization.CultureInfo culture)
{
    // convert and return something (if needed)
}

public override object  ProvideValue(IServiceProvider serviceProvider)
{
    if (_converter == null)
        _converter = new MyConverter();
    return _converter;
}

}

В результате вы получите такой синтаксис:

{Binding Converter={conv:MyConverter}}

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

Эта статья делает большую работу по объяснению концепции и предоставляет пример кода.

5 голосов
/ 19 июля 2010

В вашем конвертере вы можете иметь статическое свойство или поле, на которое вы можете ссылаться в xaml.Нет необходимости добавлять ресурс.

 public class MyConverter : IValueConverter
{
    public static readonly MyConverter Instance = new MyConverter();
... }

И в XAML

<TextBlock Text="{Binding Path=., Converter={x:Static l:MyConverter.Instance}}" />

Остерегайтесь того, что эти преобразователи не должны хранить какие-либо состояния, поскольку будет использоваться один и тот же экземпляр.Если вы ненадежный о публичных полях просто создать статическое свойство вместо этого.

1008 * Хотя это спорно, что это лучше
0 голосов
/ 19 июля 2010

Как именно вы объявляете эти конвертеры так, чтобы возникала многословность?

<conv:NegatingConverter x:Key="NegatingConverter" />

Одна строка на конвертер для приложения.

Использование также не является подробным.1007 *

0 голосов
/ 19 июля 2010

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

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