Primary WPF APIs:
CollectionViewSourceICollectionView sorting/filtering/groupingPrimary Avalonia patterns:
ListBox, TreeView, optional external DataGrid package)| WPF | Avalonia |
|---|---|
CollectionViewSource.View.Filter |
view-model predicate and projected collection |
SortDescriptions |
view-model sort state and projected ordering |
grouping in CollectionView |
grouped view-model collections + templates |
WPF C#:
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(Items);
view.Filter = item => ((Customer)item).IsActive;
view.SortDescriptions.Add(new SortDescription(nameof(Customer.Name), ListSortDirection.Ascending));
Avalonia XAML:
<StackPanel xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:MyApp.ViewModels"
x:DataType="vm:CustomersViewModel"
Spacing="8">
<TextBox Watermark="Filter" Text="{CompiledBinding Query, Mode=TwoWay}" />
<ListBox ItemsSource="{CompiledBinding VisibleCustomers}" />
</StackPanel>
using System;
using System.Collections.ObjectModel;
using System.Linq;
public sealed class CustomersViewModel
{
public ObservableCollection<Customer> AllCustomers { get; } = new();
public ObservableCollection<Customer> VisibleCustomers { get; } = new();
public void Refresh(string query)
{
var filtered = AllCustomers
.Where(x => x.IsActive)
.Where(x => string.IsNullOrWhiteSpace(query) || x.Name.Contains(query, StringComparison.OrdinalIgnoreCase))
.OrderBy(x => x.Name)
.ToList();
VisibleCustomers.Clear();
foreach (var item in filtered)
VisibleCustomers.Add(item);
}
}