Primary WPF APIs:
ListBox, ListViewSelectionMode (Single, Multiple, Extended)SelectedItem, SelectedItems, ScrollIntoView(...)Primary Avalonia APIs:
ListBox and SelectingItemsControl selection modelSelectionMode flags (Single, Multiple, Toggle, AlwaysSelected)SelectedItem, SelectedItems, Selection (ISelectionModel)AutoScrollToSelectedItem| WPF | Avalonia |
|---|---|
ListView + GridView selection |
ListBox + row template selection |
SelectionMode="Extended" |
SelectionMode="Multiple" (optional Toggle) |
SelectedItems sync patterns |
SelectedItems/Selection (ISelectionModel) |
ListBox.ScrollIntoView(item) |
AutoScrollToSelectedItem + item BringIntoView() |
WPF XAML:
<ListView ItemsSource="{Binding Users}"
SelectionMode="Extended"
SelectedItem="{Binding SelectedUser, Mode=TwoWay}">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Role" DisplayMemberBinding="{Binding Role}" />
</GridView>
</ListView.View>
</ListView>
Avalonia XAML:
<ListBox xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:MyApp.ViewModels"
x:DataType="vm:UsersViewModel"
ItemsSource="{CompiledBinding Users}"
SelectedItem="{CompiledBinding SelectedUser, Mode=TwoWay}"
SelectionMode="Multiple"
AutoScrollToSelectedItem="True">
<ListBox.ItemTemplate>
<DataTemplate x:DataType="vm:UserRowViewModel">
<Grid ColumnDefinitions="2*,*" ColumnSpacing="12">
<TextBlock Grid.Column="0" Text="{CompiledBinding Name}" />
<TextBlock Grid.Column="1" Text="{CompiledBinding Role}" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
using Avalonia.Controls;
var list = new ListBox
{
ItemsSource = viewModel.Users,
SelectionMode = SelectionMode.Multiple | SelectionMode.Toggle,
AutoScrollToSelectedItem = true
};
list.Selection.Select(0);
list.Selection.Select(2);
list.Selection.Deselect(0);
list.Selection.SelectedIndex = 3;
Extended.
SelectionMode="Multiple" and optionally add Toggle for click-to-toggle semantics.AutoScrollToSelectedItem; for custom containers call BringIntoView() when needed.