Back to list
christian289

using-avalonia-collectionview

by christian289

ClaudeCode와 함께하는 .NET 개발 튜토리얼

1🍴 0📅 Jan 25, 2026

SKILL.md


name: using-avalonia-collectionview description: "Provides CollectionView alternatives for AvaloniaUI using DataGridCollectionView and ReactiveUI. Use when filtering, sorting, or grouping collections in AvaloniaUI applications."

6.7 MVVM Pattern with CollectionView

⚠️ Important: AvaloniaUI does not support WPF's CollectionViewSource.

Project Structure

The templates folder contains a .NET 9 AvaloniaUI project example.

templates/
├── AvaloniaCollectionViewSample.Core/           ← Pure C# models and interfaces
│   ├── Member.cs
│   ├── IMemberCollectionService.cs
│   └── AvaloniaCollectionViewSample.Core.csproj
├── AvaloniaCollectionViewSample.ViewModels/     ← ViewModel (no Avalonia references)
│   ├── MainViewModel.cs
│   ├── GlobalUsings.cs
│   └── AvaloniaCollectionViewSample.ViewModels.csproj
├── AvaloniaCollectionViewSample.AvaloniaServices/ ← Avalonia Service Layer
│   ├── MemberCollectionService.cs
│   ├── GlobalUsings.cs
│   └── AvaloniaCollectionViewSample.AvaloniaServices.csproj
└── AvaloniaCollectionViewSample.App/            ← Avalonia Application
    ├── Views/
    │   ├── MainWindow.axaml
    │   └── MainWindow.axaml.cs
    ├── App.axaml
    ├── App.axaml.cs
    ├── Program.cs
    ├── GlobalUsings.cs
    └── AvaloniaCollectionViewSample.App.csproj

In AvaloniaUI, use the following approaches:

6.7.1 Using DataGridCollectionView (Recommended)

// NuGet: Avalonia.Controls.DataGrid
// Service Layer
namespace MyApp.Services;

using Avalonia.Controls;

public sealed class MemberCollectionService
{
    private ObservableCollection<Member> Source { get; } = [];

    // Returns DataGridCollectionView
    public IEnumerable CreateView(Predicate<Member>? filter = null)
    {
        var view = new DataGridCollectionView(Source);

        if (filter is not null)
        {
            view.Filter = item => filter((Member)item);
        }

        return view;
    }

    public void Add(Member item) => Source.Add(item);
    public void Remove(Member? item) { if (item is not null) Source.Remove(item); }
    public void Clear() => Source.Clear();
}

6.7.2 Using ReactiveUI (Alternative)

// NuGet: ReactiveUI.Avalonia
namespace MyApp.ViewModels;

using ReactiveUI;
using DynamicData;

public sealed class MainViewModel : ReactiveObject
{
    private readonly SourceList<Member> _sourceList = new();
    private readonly ReadOnlyObservableCollection<Member> _members;

    public ReadOnlyObservableCollection<Member> Members => _members;

    public MainViewModel()
    {
        _sourceList
            .Connect()
            .Filter(m => m.IsActive) // Filtering
            .Sort(SortExpressionComparer<Member>.Ascending(m => m.Name)) // Sorting
            .Bind(out _members)
            .Subscribe();
    }

    public void AddMember(Member member) => _sourceList.Add(member);
    public void RemoveMember(Member member) => _sourceList.Remove(member);
}

Score

Total Score

65/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

+10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

1ヶ月以内に更新

+10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

+5

Reviews

💬

Reviews coming soon