Why should I declare my own ValueConverter as a StaticResource and bind to a resource instead of binding to its type?

Given this class:

namespace My.App.Converters
{
  [ValueConversion(typeof(bool?), typeof(Visibility))]
  public class NullableBooleanToVisibilityConverter : IValueConverter
  {
    ...
  }
}

Why do I need to do the following:

<UserControl ...
             xmlns:converters="clr-namespace:My.App.Converters">
  <UserControl.Resources>
    <converters:NullableBooleanToVisibilityConverter x:Key="visibilityConverter" />
  </UserControl.Resources>
  ...
  <Button MinWidth="120" HorizontalAlignment="Left"
          Visibility="{Binding BackButtonVisible, Converter={StaticResource visibilityConverter}}" />
  ...
</UserControl>

instead of doing something like the following:

<UserControl ...
             xmlns:converters="clr-namespace:My.App.Converters">
  ...
  <Button MinWidth="120" HorizontalAlignment="Left"
          Visibility="{Binding BackButtonVisible, ConverterType={x:Type converters:NullableBooleanToVisibilityConverter}}" />
  ...
</UserControl>

considering that I only ever want to use this particular converter in one place in my application, i.e. in this particular one UserControl?

Is the answer as simple as "Microsoft didn't want to add ConverterType, and you can do it yourself with markup extensions if you really want to," or is there a reason for a good programming style for this? ("Reuse" is not taken into account in this example.)

+3
source share
4 answers

, . , NullableBooleanToVisibilityConverter,

namespace My.App.Converters
{
  [ValueConversion(typeof(bool?), typeof(Visibility))]
  public class NullableBooleanToVisibilityConverter : IValueConverter
  {
    public static NullableBooleanToVisibilityConverter Instance = new NullableBooleanToVisibilityConverter();

   /* Convert and ConvertBack methods */
  }
}

EDIT

,

<Button MinWidth="120" HorizontalAlignment="Left"
          Visibility="{Binding BackButtonVisible, Converter={x:Static:NullableBooleanToVisibilityConverter.Instance}}" />
+3
ConverterType={x:Type converters:NullableBooleanToVisibilityConverter}

? , , .

0

, default parameterless constructor. , .

, , - . , ;

  • ( )?
  • ?
  • , , ?
0

, , , () :

<UserControl ...
             xmlns:converters="clr-namespace:My.App.Converters">
  <UserControl.Resources>
    <converters:NullableBooleanToVisibilityConverter x:Key="visibilityConverter"
                                                     IsInverted="True" />
  </UserControl.Resources>
  ...
  <Button MinWidth="120" HorizontalAlignment="Left"
          Visibility="{Binding BackButtonVisible, Converter={StaticResource visibilityConverter}}" />
  ...
</UserControl>

, inline:

<UserControl ...
             xmlns:converters="clr-namespace:My.App.Converters">
  ...
  <Button MinWidth="120" HorizontalAlignment="Left"
          Visibility="{Binding BackButtonVisible, Converter={StaticResource visibilityConverter}}" />
    <Button.Visiblity>
      <Binding Path="BackButtonVisible">
        <Binding.Converter>
          <converters:NullableBooleanToVisibilityConverter x:Key="visibilityConverter" />
        </Binding.Converter>
      </Binding>
    </Button>
  ...
</UserControl>
0

All Articles