Built-in converter
BooleanToVisibilityConverter
BooleanToVisibilityConverter is located in System.Windows.Controls .
<Window >
<Window.Resources >
<BooleanToVisibilityConverter x:Key ="BooleanToVisibilityConverter" />
</Window.Resources >
<TextBlock Visibility ="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}" />
InvertedBooleanToVisibilityConverter
InvertedBooleanToVisibilityConverter.cs
public class InvertedBooleanToVisibilityConverter : IValueConverter
{
public object Convert (object value , Type targetType , object parameter , CultureInfo culture )
{
var flag = false ;
if (!(value is bool flag) && value is bool ? nullable)
{
flag = nullable.Value;
}
return (object ) (Visibility) (flag ? 2 : 0 );
}
public object ConvertBack (object value , Type targetType , object parameter , CultureInfo culture )
=> (object ) (bool ) (!(value is Visibility visibility ) ? 0 : (visibility == Visibility .Collapsed ? 1 : 0 ));
}
ValueConverter
<UserControl xmlns:conversion ="clr-namespace:MyNamespace.Conversion" >
<UserControl.Resources >
<conversion:ListToVisibilityConverter x:Key ="ListToVisibilityConverter" />
</UserControl.Resources >
<TextBlock Visibility ="{Binding MyList, Converter={StaticResource ListToVisibilityConverter}}" />
ListToVisibilityConverter.cs
namespace MyNamespace .Conversion
{
[ValueConversion (typeof(IEnumerable), typeof(Visibility))]
public class ListToVisibilityConverter : IValueConverter
{
public object Convert (object value , Type targetType , object parameter , CultureInfo culture )
{
if (value is IEnumerable itemCollection)
{
return itemCollection.Cast <object >().Any () ? Visibility .Visible : Visibility .Collapsed ;
}
return DependencyProperty.UnsetValue;
}
public object ConvertBack (object value , Type targetTypes , object parameter , CultureInfo culture )
{
throw new NotImplementedException ();
throw new NotSupportedException ();
return null ;
}
}
}
Inverted convertion
Inverted convertion with IsInverted property
<UserControl xmlns:conversion ="clr-namespace:MyNamespace.Conversion" >
<UserControl.Resources >
<conversion:ListToVisibilityConverter x:Key ="EmptyListToCollapsedConverter" />
<conversion:ListToVisibilityConverter x:Key ="EmptyListToVisibleConverter"
IsInverted ="true" />
</UserControl.Resources >
<TextBlock Visibility ="{Binding MyList, Converter={StaticResource EmptyListToCollapsedConverter}}" />
<TextBlock Visibility ="{Binding MyList, Converter={StaticResource EmptyListToVisibleConverter}}" />
ListToVisibilityConverter.cs
namespace MyNamespace .Conversion
{
[ValueConversion (typeof(IEnumerable), typeof(Visibility))]
public class ListToVisibilityConverter : IValueConverter
{
public bool IsInverted { get ; set ; }
public object Convert (object value , Type targetType , object parameter , CultureInfo culture )
{
var visibleFlag = false ;
if (value is IEnumerable itemCollection)
{
visibleFlag = itemCollection.Cast <object >().Any ();
}
else
{
return DependencyProperty.UnsetValue;
}
if (this .IsInverted)
{
visibleFlag = !visibleFlag;
}
return visibleFlag ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack (object value , Type targetTypes , object parameter , CultureInfo culture )
{
throw new NotImplementedException ();
}
}
}
The ConverterParameter property can not be bound because it is not a dependency property. Use MultiValueConverter as an alternative.
<TextBlock Visibility ="{Binding MyList, Converter={StaticResource ListToVisibilityConverter}, ConverterParameter=Inverted}" />
ListToVisibilityConverter.cs
[ValueConversion (typeof(IEnumerable), typeof(Visibility))]
public class ListToVisibilityConverter : IValueConverter
{
public object Convert (object value , Type targetType , object parameter , CultureInfo culture )
{
var visibleFlag = false ;
if (value is IEnumerable itemCollection)
{
visibleFlag = itemCollection.Cast <object >().Any ();
}
else
{
return DependencyProperty.UnsetValue;
}
if (parameter != null && Enum.TryParse (parameter .ToString (), true , out Parameters invert) && invert == Parameters .Inverted )
{
visibleFlag = !visibleFlag ;
}
return visibleFlag ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack (object value , Type targetTypes , object parameter , CultureInfo culture )
{
throw new NotImplementedException ();
}
private enum Parameters
{
Normal,
Inverted
}
MultiValueConverter
<UserControl xmlns:conversion ="clr-namespace:MyNamespace.Conversion" >
<UserControl.Resources >
<conversion:TakeItemsConverter x:Key ="TakeItemsConverter" />
</UserControl.Resources >
<ItemsControl >
<ItemsControl.ItemsSource >
<MultiBinding Converter ="{StaticResource TakeItemsConverter}" >
<Binding Path ="Items" />
<Binding Path ="MaxNumberOfItemsToDisplay" />
</MultiBinding >
</ItemsControl.ItemsSource >
</ItemsControl >
namespace MyNamespace .Conversion
{
public class TakeItemsConverter : IMultiValueConverter
{
public object Convert (object [] values , Type targetType , object parameter , CultureInfo culture )
{
if (values != null
&& values.Length == 2
&& values[0 ] is IEnumerable itemCollection
&& values[1 ] != null
&& int .TryParse (values [1 ].ToString (), NumberStyles .Integer , culture, out var numberOfItemsToTake ))
{
return itemCollection .Cast <object >().Take (numberOfItemsToTake );
}
return DependencyProperty.UnsetValue;
}
public object [] ConvertBack (object value , Type [] targetTypes , object parameter , CultureInfo culture )
{
throw new NotImplementedException ();
}
}
}
Examples
BooleanToCursorConverter
afficher [ValueConversion (typeof(bool), typeof(Cursor))]
public sealed class BooleanToCursorConverter : IValueConverter
{
public object Convert (object value , Type targetType , object parameter , CultureInfo culture )
{
if (value is bool isBusy)
{
return isBusy ? Cursors.Wait : Cursors.Arrow;
}
return DependencyProperty.UnsetValue;
}
public object ConvertBack (object value , Type targetTypes , object parameter , CultureInfo culture )
{
throw new NotImplementedException ();
}
}
afficher MyWindow.xaml
<Window xmlns:converters ="clr-namespace:MyApp.Converters" >
<Window.Resources >
<converters:BooleanToCursorConverter x:Key ="BooleanToCursorConverter" />
</Window.Resources >
<Window.Cursor >
<Binding Path ="IsBusy"
Converter ="{StaticResource BooleanToCursorConverter}" />
</Window.Cursor >