Можно ли определить конвертер для привязки inline (без ресурса)? - PullRequest
8 голосов
/ 23 июля 2011

Можно ли определить конвертер типов для привязки inline (без ресурса)?

Примерно так:

   <Button Visibility="{Binding ElementName=checkBox, Path=IsChecked, Converter={new BooleanToVisibilityConverter}" />

Ответы [ 4 ]

8 голосов
/ 24 июля 2011

Вы можете создать и открыть свой конвертер через пользовательский MarkupExtension, который даст вам встроенную декларацию, которую вы ищете:

public class BooleanToVisibilityConverterExtension : MarkupExtension, IValueConverter
{
  private BooleanToVisibilityConverter converter;

  public BooleanToVisibilityCoverterExtension() : base()
  {
    this.converter = new BooleanToVisibilityConverter();
  }

  public override object ProvideValue(IServiceProvider serviceProvider)
  {
    return this;
  }

  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    return this.converter.Convert(value, targetType, parameter, culture);
  }

  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  {
    return this.converter.ConvertBack(value, targetType, parameter, culture);
  }
}

Теперь вы можете использовать встроенное MarkupExtension для создания нового конвертера:

<Button Visibility="{Binding Converter={local:BooleanToVisibilityConverter} ...}" .. />
7 голосов
/ 23 июля 2011

Невозможно использовать синтаксис привязки.Но это возможно, используя синтаксис элемента:

 <Button.Visibility>
    <Binding ElementName="checkBox" Path=IsChecked>
        <Binding.Converter>
            <BooleanToVisibilityConverter />
        </Binding.Converter>
    </Binding>
 </Button.Visibility>

Но Почему Вы хотите сделать это?Это будет означать, что каждый экземпляр привязки будет создавать новый конвертер.Это не эффективно с точки зрения памяти.

3 голосов
/ 23 июля 2011

Вы могли бы сделать что-то вроде этого.Этот должен работать.

Псевдокод :

public static class ConverterHost 
{ 
    public static readonly MyCoolConverter converter = new MyCoolConverter (); 
}

и в XAML, например, как этот:

{Binding Converter={x:Static conv:ConverterHost.converter }}

Надеюсь, это поможет.

С уважением.

2 голосов
/ 23 июля 2011

Нет, вам нужно где-то определить конвертер как ресурс (window, usercontrol и т. Д.), Прежде чем использовать его в привязке.

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