| name | avalonia-controls-input |
| description | Use when working with Avalonia input controls: Button, ToggleButton, RadioButton, CheckBox, TextBox, ComboBox, Slider, Calendar, DatePicker, TimePicker, NumericUpDown, or VirtualKeyboard. Covers key properties, events, binding patterns, and common pitfalls for each control in Avalonia 12. |
Avalonia Input Controls
Overview
Input controls capture user data or trigger actions. All support IsEnabled, IsVisible, and standard styling.
Button
| Property | Type | Notes |
|---|
Content | object | Any content, including XAML subtrees |
Command | ICommand | Bound command; auto-manages IsEnabled |
CommandParameter | object | Passed to command |
IsDefault | bool | Triggers on Enter |
IsCancel | bool | Triggers on Escape |
ClickMode | ClickMode | Release (default), Press, Hover |
Events: Click
Variants: RepeatButton (fires Click repeatedly while held), ToggleButton (stateful press)
<Button Content="Save" Command="{Binding SaveCommand}" IsDefault="True"/>
<Button Click="OnClick">
<StackPanel Orientation="Horizontal" Spacing="8">
<PathIcon Data="M17 3H5c-1.1 0-2 .9-2 2v14l7-3 7 3V5c0-1.1-.9-2-2-2z" Width="16" Height="16"/>
<TextBlock Text="Save" VerticalAlignment="Center"/>
</StackPanel>
</Button>
<RepeatButton Content="+" Command="{Binding IncrementCommand}" Delay="400" Interval="100"/>
<ToggleButton Content="Bold" IsChecked="{Binding IsBold}"/>
CheckBox
| Property | Type | Notes |
|---|
IsChecked | bool? | null = indeterminate |
IsThreeState | bool | Enables null/indeterminate state |
Content | object | Label displayed next to box |
<CheckBox Content="Enable notifications" IsChecked="{Binding IsNotificationsEnabled}"/>
<CheckBox Content="Select all" IsThreeState="True" IsChecked="{Binding AllSelected}"/>
private bool? _allSelected;
public bool? AllSelected
{
get => _allSelected;
set => SetProperty(ref _allSelected, value);
}
RadioButton
| Property | Type | Notes |
|---|
IsChecked | bool | TwoWay by default |
GroupName | string | Groups buttons across panels |
Content | object | Label |
<StackPanel>
<RadioButton Content="Small" GroupName="Size" IsChecked="{Binding IsSmall}"/>
<RadioButton Content="Medium" GroupName="Size" IsChecked="{Binding IsMedium}"/>
<RadioButton Content="Large" GroupName="Size" IsChecked="{Binding IsLarge}"/>
</StackPanel>
<StackPanel>
<RadioButton Content="Option A"/>
<RadioButton Content="Option B"/>
</StackPanel>
Tip: For enum-based selection, bind each IsChecked to a converter comparing the enum value, or use ItemsControl with RadioButton items.
TextBox
| Property | Type | Notes |
|---|
Text | string | TwoWay by default — do not add Mode=TwoWay |
Watermark | string | Placeholder text |
MaxLength | int | 0 = unlimited |
AcceptsReturn | bool | Multiline input |
TextWrapping | TextWrapping | NoWrap, Wrap, WrapWithOverflow |
IsReadOnly | bool | Prevents editing |
PasswordChar | char | Masks input (e.g. •) |
SelectionStart | int | Caret/selection start |
SelectionLength | int | Selection length |
InnerLeftContent | object | Icon inside left edge |
InnerRightContent | object | Icon inside right edge |
Events: TextChanged, TextChanging, LostFocus, KeyDown
<TextBox Watermark="Enter name..." Text="{Binding Name}" MaxLength="100"/>
<TextBox AcceptsReturn="True" TextWrapping="Wrap" Height="120" Text="{Binding Notes}"/>
<TextBox PasswordChar="•" Watermark="Password" Text="{Binding Password}"/>
<TextBox Watermark="Search...">
<TextBox.InnerLeftContent>
<PathIcon Data="M15.5 14h-.79l-.28-.27A6.471..." Width="16" Height="16" Margin="4,0"/>
</TextBox.InnerLeftContent>
</TextBox>
ComboBox
| Property | Type | Notes |
|---|
ItemsSource | IEnumerable | Bound collection |
SelectedItem | object | TwoWay by default |
SelectedIndex | int | Zero-based |
SelectedValue | object | Used with SelectedValueBinding |
IsEditable | bool | Allows text entry |
PlaceholderText | string | Shown when nothing selected |
MaxDropDownHeight | double | Limits dropdown height |
<ComboBox ItemsSource="{Binding Options}"
SelectedItem="{Binding SelectedOption}"
PlaceholderText="Select..."/>
<ComboBox ItemsSource="{Binding Countries}" SelectedItem="{Binding SelectedCountry}">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="vm:CountryVm">
<StackPanel Orientation="Horizontal" Spacing="8">
<Image Source="{Binding FlagUri}" Width="20" Height="14"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ComboBox IsEditable="True" ItemsSource="{Binding Suggestions}" Text="{Binding InputText}"/>
Slider
| Property | Type | Notes |
|---|
Minimum | double | Default: 0 |
Maximum | double | Default: 100 |
Value | double | TwoWay by default |
TickFrequency | double | Interval between ticks |
IsSnapToTickEnabled | bool | Snaps value to tick marks |
Orientation | Orientation | Horizontal (default), Vertical |
IsDirectionReversed | bool | Inverts direction |
TickPlacement | TickPlacement | None, TopLeft, BottomRight, Outside |
<Slider Minimum="0" Maximum="100" Value="{Binding Volume}"
TickFrequency="10" IsSnapToTickEnabled="True" TickPlacement="BottomRight"/>
<Slider Orientation="Vertical" Minimum="0" Maximum="1"
Value="{Binding Opacity}" Height="200"/>
NumericUpDown
| Property | Type | Notes |
|---|
Value | decimal? | TwoWay by default |
Minimum | decimal? | Lower bound |
Maximum | decimal? | Upper bound |
Increment | decimal | Step per click |
FormatString | string | e.g. "F2", "N0", "C2" |
AllowSpin | bool | Show up/down buttons |
ShowButtonSpinner | bool | Toggle spinner visibility |
NumberFormat | NumberFormatInfo | Culture-specific formatting |
<NumericUpDown Value="{Binding Quantity}" Minimum="1" Maximum="999" Increment="1" FormatString="N0"/>
<NumericUpDown Value="{Binding Price}" Minimum="0" Increment="0.01" FormatString="C2"/>
<NumericUpDown Value="{Binding Amount}" AllowSpin="False"/>
Calendar
| Property | Type | Notes |
|---|
SelectedDate | DateTime? | Selected date |
DisplayMode | CalendarMode | Month, Year, Decade |
DisplayDate | DateTime | Currently displayed month |
BlackoutDates | CalendarBlackoutDatesCollection | Disabled dates |
IsTodayHighlighted | bool | Highlights today |
SelectionMode | CalendarSelectionMode | SingleDate, SingleRange, MultipleRange, None |
<Calendar SelectedDate="{Binding SelectedDate}"
DisplayMode="Month"
IsTodayHighlighted="True"/>
calendar.BlackoutDates.Add(new CalendarDateRange(DateTime.Today.AddDays(1), DateTime.Today.AddDays(7)));
DatePicker
| Property | Type | Notes |
|---|
SelectedDate | DateTimeOffset? | Note: not DateTime |
DisplayDateStart | DateTimeOffset? | Earliest selectable |
DisplayDateEnd | DateTimeOffset? | Latest selectable |
Watermark | string | Placeholder |
DayFormat | string | Day display format |
MonthFormat | string | Month display format |
YearFormat | string | Year display format |
<DatePicker SelectedDate="{Binding BirthDate}" Watermark="Select date"/>
<DatePicker SelectedDate="{Binding AppointmentDate}"
DisplayDateStart="{Binding TodayOffset}"
DisplayDateEnd="{Binding MaxDateOffset}"/>
DateTime? date = picker.SelectedDate?.DateTime;
TimePicker
| Property | Type | Notes |
|---|
SelectedTime | TimeSpan? | Selected time value |
ClockIdentifier | string | "12HourClock" or "24HourClock" |
MinuteIncrement | int | Snap interval (1–59) |
<TimePicker SelectedTime="{Binding MeetingTime}" ClockIdentifier="24HourClock"/>
<TimePicker SelectedTime="{Binding AlarmTime}" ClockIdentifier="12HourClock" MinuteIncrement="15"/>
Common Mistakes
| Mistake | Fix |
|---|
TextBox Text="{Binding X, Mode=TwoWay}" | Remove Mode=TwoWay — it's the default |
ComboBox with value types, SelectedItem not working | Use SelectedIndex or ensure proper equality; value types match by value but boxed objects may not |
All RadioButtons in same panel auto-group | Use GroupName to separate groups across panels or force cross-panel grouping |
DatePicker.SelectedDate typed as DateTime | It's DateTimeOffset? — convert with .DateTime |
NumericUpDown.Value typed as double | It's decimal? — use decimal in ViewModel |
TextBox binding not updating on every keystroke | Default updates on LostFocus; use UpdateSourceTrigger=PropertyChanged if needed |
PasswordChar with compiled bindings | No issue, but Text binding exposes password in ViewModel — consider SecureString patterns |