IValueConverter in XAML ResourcesFuncValueConverter)BoolConverters, StringConverters, ObjectConverters)MultiBinding and IMultiValueConverterFuncMultiValueConverter)Primary APIs:
IValueConverterIMultiValueConverterFuncValueConverter<TIn, TOut>FuncValueConverter<TIn, TParam, TOut>FuncMultiValueConverter<TIn, TOut>ReflectionBinding / BindingCompiledBindingTemplateBindingMultiBindingBindingOperations.DoNothingBuilt-in converter helpers:
BoolConvertersStringConvertersObjectConvertersReference source files:
src/Avalonia.Base/Data/Converters/IValueConverter.cssrc/Avalonia.Base/Data/Converters/IMultiValueConverter.cssrc/Avalonia.Base/Data/Converters/FuncValueConverter.cssrc/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cssrc/Avalonia.Base/Data/Converters/BoolConverters.cssrc/Avalonia.Base/Data/Converters/StringConverters.cssrc/Avalonia.Base/Data/Converters/ObjectConverters.cssrc/Avalonia.Base/Data/MultiBinding.cssrc/Avalonia.Base/Data/ReflectionBinding.cssrc/Avalonia.Base/Data/CompiledBinding.cssrc/Avalonia.Base/Data/TemplateBinding.cssrc/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ReflectionBindingExtension.cssrc/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindingExtension.csSingle-value conversion:
IValueConverter for Binding, ReflectionBinding, CompiledBinding, TemplateBinding.Multi-value conversion:
IMultiValueConverter and use with MultiBinding.Authoring styles:
FuncValueConverter, FuncMultiValueConverter) for concise code wiring.IValueConverter in XAML ResourcesConverter class:
using System;
using System.Globalization;
using Avalonia;
using Avalonia.Data.Converters;
public sealed class StatusToTextConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
=> value switch
{
true => "Online",
false => "Offline",
_ => AvaloniaProperty.UnsetValue
};
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
=> value switch
{
"Online" => true,
"Offline" => false,
_ => AvaloniaProperty.UnsetValue
};
}
Register and use in XAML resources:
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:conv="using:MyApp.Converters">
<Window.Resources>
<conv:StatusToTextConverter x:Key="StatusToText" />
</Window.Resources>
<TextBlock Text="{Binding IsOnline, Converter={StaticResource StatusToText}}" />
</Window>
Resource scope can be:
Application.Resources (global),Window.Resources / UserControl.Resources (local),FuncValueConverter)C# wiring example:
using Avalonia.Data;
using Avalonia.Data.Converters;
var textConverter = new FuncValueConverter<decimal, string>(v => v.ToString("0.00"));
textBlock.Bind(TextBlock.TextProperty, new ReflectionBinding(nameof(ViewModel.Total))
{
Converter = textConverter
});
With converter parameter:
var suffixConverter = new FuncValueConverter<string, string, string>((value, suffix) =>
$"{value}{suffix}");
textBlock.Bind(TextBlock.TextProperty, new ReflectionBinding(nameof(ViewModel.Name))
{
Converter = suffixConverter,
ConverterParameter = " (active)"
});
Tip:
x:Static.BoolConverters, StringConverters, ObjectConverters)Avalonia ships reusable static converters.
XAML usage with x:Static:
<TextBlock IsVisible="{Binding Item, Converter={x:Static ObjectConverters.IsNotNull}}" />
<ToggleButton IsChecked="{Binding IsEnabled, Converter={x:Static BoolConverters.Not}}" />
<TextBlock IsVisible="{Binding Query, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" />
Useful built-ins:
BoolConverters.Not (single value),BoolConverters.And / BoolConverters.Or (multi-value),ObjectConverters.IsNull, IsNotNull, Equal, NotEqual,StringConverters.IsNullOrEmpty, IsNotNullOrEmpty.Built-in multi-converter with MultiBinding:
<TextBlock.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="IsEnabled" />
<Binding Path="HasSelection" />
</MultiBinding>
</TextBlock.IsVisible>
MultiBinding and IMultiValueConverterIMultiValueConverter:
Convert(...) (no ConvertBack).Class-based multi converter:
using System;
using System.Collections.Generic;
using System.Globalization;
using Avalonia;
using Avalonia.Data.Converters;
public sealed class FullNameConverter : IMultiValueConverter
{
public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)
{
var first = values.Count > 0 ? values[0]?.ToString() : null;
var last = values.Count > 1 ? values[1]?.ToString() : null;
if (string.IsNullOrWhiteSpace(first) && string.IsNullOrWhiteSpace(last))
return AvaloniaProperty.UnsetValue;
return $"{first} {last}".Trim();
}
}
XAML wiring:
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:conv="using:MyApp.Converters">
<Window.Resources>
<conv:FullNameConverter x:Key="FullNameConverter" />
</Window.Resources>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource FullNameConverter}" FallbackValue="(unknown)">
<Binding Path="FirstName" />
<Binding Path="LastName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Window>
Notes:
MultiBinding supports nested bindings, including nested MultiBinding.StringFormat can be used with or without a converter.FuncMultiValueConverter)C# example:
using Avalonia.Data;
using Avalonia.Data.Converters;
var join = new FuncMultiValueConverter<string, string>(values => string.Join(" / ", values));
var binding = new MultiBinding
{
Converter = join,
Bindings =
{
new ReflectionBinding(nameof(ViewModel.LeftText)),
new ReflectionBinding(nameof(ViewModel.RightText)),
}
};
textBlock.Bind(TextBlock.TextProperty, binding);
For XAML reuse, expose converter instances via static properties and reference them with x:Static.
Reflection binding (XAML):
<TextBlock Text="{Binding Name, Converter={StaticResource NameConverter}}" />
Compiled binding (XAML):
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyApp"
x:DataType="local:MyVm"
x:CompileBindings="True">
<TextBlock Text="{CompiledBinding Name, Converter={StaticResource NameConverter}, ConverterParameter=VIP}" />
</UserControl>
Compiled binding (C# API):
var binding = CompiledBinding.Create<MyVm, decimal>(
vm => vm.Total,
converter: new FuncValueConverter<decimal, string>(v => v.ToString("C2")));
textBlock.Bind(TextBlock.TextProperty, binding);
Template binding:
<Border Background="{TemplateBinding Background, Converter={StaticResource BrushConverter}}" />
MultiBinding + compile bindings:
x:CompileBindings="True" also affects <Binding .../> items inside <MultiBinding>.IValueConverter guidance:
BindingNotification for binding error states when needed,AvaloniaProperty.UnsetValue when value cannot be converted.IMultiValueConverter guidance:
AvaloniaProperty.UnsetValue to trigger FallbackValue,null to trigger TargetNullValue,BindingOperations.DoNothing keeps current target value unchanged.FuncValueConverter / FuncMultiValueConverter for local concise wiring.ConverterParameter types explicit (resource/static objects if non-string needed).MultiBinding only when the value truly depends on multiple sources.BindingOperations.DoNothing.UnsetValue hits fallback path unexpectedly.UnsetValue.x:CompileBindings="True" and/or x:DataType.ConvertBack is missing/invalid for single-value converters.ConvertBack semantics.