« Converter » : différence entre les versions
Apparence
Ligne 95 : | Ligne 95 : | ||
= MultiValueConverter = | = MultiValueConverter = | ||
<kode lang="xaml"> | <kode lang="xaml"> | ||
<UserControl xmlns: | <UserControl xmlns:conversion="clr-namespace:MyNamespace.Conversion"> | ||
<UserControl.Resources> | <UserControl.Resources> | ||
< | <conversion:TakeItemsConverter x:Key="TakeItemsConverter"/> | ||
</UserControl.Resources> | </UserControl.Resources> | ||
< | <ItemsControl> | ||
<ItemsControl.ItemsSource> | |||
<MultiBinding Converter="{StaticResource TakeItemsConverter}"> | |||
< | <Binding Path="Items" /> | ||
</ | <Binding Path="MaxNumberOfItemsToDisplay" /> | ||
</ | </MultiBinding> | ||
</ItemsControl.ItemsSource> | |||
</ItemsControl> | |||
</kode> | </kode> | ||
<kode lang="csharp"> | <kode lang="csharp"> | ||
namespace | namespace MyNamespace.Conversion | ||
{ | { | ||
// L'attribut ValueConversion n'est pas utilisé ici car il n'est pas adapté | // L'attribut ValueConversion n'est pas utilisé ici car il n'est pas adapté | ||
// au MultiValueConverter : il ne peut définir qu'un seul type d'entrée | // au MultiValueConverter : il ne peut définir qu'un seul type d'entrée | ||
public class | public class TakeItemsConverter : IMultiValueConverter | ||
{ | { | ||
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) | public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) | ||
{ | { | ||
// expect 2 values, an IEnumerable and an int | |||
if (values != null | |||
.. | && values.Length == 2 | ||
return | && 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; | |||
} | } | ||
Version du 17 avril 2020 à 23:10
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}}" />
|
ValueConverter
<UserControl xmlns:conversion="clr-namespace:MyNamespace.Conversion">
<UserControl.Resources>
<conversion:ListToVisibilityConverter x:Key="ListToVisibilityConverter" />
</UserControl.Resources>
<TextBlock Visibility="{Binding MyList, Converter={StaticResource ListToVisibilityConverter}}" />
|
namespace MyNamespace.Conversion
{
// L'attribut ValueConversion est optionel,
// il permet de spécifier le type d'entrée et le type de sortie
[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 Visibility.Collapsed;
}
// Conversion inverse non-implémentée
public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
throw new NotImplementedException();
return null;
}
}
}
|
Inverted convertion
<TextBlock Visibility="{Binding MyProperty, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=Inverted}" />
|
BooleanToVisibilityConverter.cs |
[ValueConversion(typeof(bool), typeof(Visibility))]
public sealed class BooleanToVisibilityConverter : IValueConverter
{
public object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool visibleFlag;
if (value is bool b)
{
visibleFlag = b;
}
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 IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
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
{
// L'attribut ValueConversion n'est pas utilisé ici car il n'est pas adapté
// au MultiValueConverter : il ne peut définir qu'un seul type d'entrée
public class TakeItemsConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
// expect 2 values, an IEnumerable and an int
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;
}
// Conversion inverse non-implémentée
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
|