ListViewExtensions 1.3.1
dotnet add package ListViewExtensions --version 1.3.1
NuGet\Install-Package ListViewExtensions -Version 1.3.1
<PackageReference Include="ListViewExtensions" Version="1.3.1" />
paket add ListViewExtensions --version 1.3.1
#r "nuget: ListViewExtensions, 1.3.1"
// Install ListViewExtensions as a Cake Addin #addin nuget:?package=ListViewExtensions&version=1.3.1 // Install ListViewExtensions as a Cake Tool #tool nuget:?package=ListViewExtensions&version=1.3.1
ListView Extensions
WPFのListViewは効果的にコレクションの内容を表示することができますが、ヘッダーをクリックしてソートしたり、右クリックやダブルクリック、選択したアイテムの取得などの機能を実装するととたんに難しくなります。
ListView Extensionsは、そのようなListViewのポテンシャルを簡単に引き出すために、View / ViewModel / Modelの各面からサポートをするライブラリです。
主な機能
- ソート
- 項目の複数選択のバインディング
- 項目のダブルクリックのViewModel通知
- スレッドセーフなコレクション操作
動作環境
- .NET Core 3.1以上 / .NET Framework 4.5.2以上
使用方法
1. Nugetからインストール
https://www.nuget.org/packages/ListViewExtensions
2. XAML名前空間を設定
XAMLで名前空間 "http://schemas.eh500-kintarou.com/ListViewExtensions" を設定します。
<Window x:Class="ListViewExtensionsTest.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:lv="http://schemas.eh500-kintarou.com/ListViewExtensions"
Title="MainWindow" Height="480" Width="640">
3. Viewを作成
View内でListViewを作成します。その際、GridViewColumnで列を設定する代わりに、SortableGridViewColumnを使用することで、その列でソートすることができるようになります。 また、SelectedItemsSync.Source添付プロパティを使うことによって、そのままではバインディングできないSelectedItemsプロパティを疑似的にバインディングできるようになります。
<ListView ItemsSource="{Binding People}"
lv:SelectedItemsSync.Source="{Binding People.SelectedItemsSetter}" >
<ListView.View>
<GridView>
<lv:SortableGridViewColumn Width="120" SortableSource="{Binding People}" DisplayMemberBinding="{Binding Name}" Header="Name" />
<lv:SortableGridViewColumn Width="150" SortableSource="{Binding People}" DisplayMemberBinding="{Binding Pronunciation}" Header="Pronunciation" />
<lv:SortableGridViewColumn Width="70" SortableSource="{Binding People}" DisplayMemberBinding="{Binding Age}" Header="Age" />
<lv:SortableGridViewColumn Width="120" SortableSource="{Binding People}" DisplayMemberBinding="{Binding Birthday}" Header="Birthday" />
<lv:SortableGridViewColumn Width="120" SortableSource="{Binding People}" DisplayMemberBinding="{Binding Height}" Header="Height" />
</GridView>
</ListView.View>
</ListView>
4. Modelを作成
Model内でSortableObservableCollectionクラスをインスタンス化します。これはListViewで表示される内容に対応するコレクションで、スレッドセーフに作ってあります。
public SortableObservableCollection<PersonModel> People { get; } = new SortableObservableCollection<PersonModel>();
5. ViewModelを作成
ViewModel内でListViewViewModelクラスをインスタンス化します。ModelのSortableObservableCollectionの変更通知をUIスレッドに転送してくれるほか、並び変え、選択などのコマンドも持っていて、ListViewの多くの機能を受け止めることができます。
People = new ListViewViewModel<PersonViewModel, PersonModel>(model.People, person => new PersonViewModel(person), DispatcherHelper.UIDispatcher);
6. サンプルコードをチェック
このリポジトリにはサンプルコードが含まれています。 サンプルコード を見ることでより理解が深まります。
プロジェクトURL
https://github.com/EH500-Kintarou/ListViewExtensions
https://www.nuget.org/packages/ListViewExtensions
https://days-of-programming.blogspot.com/search/label/ListView%20Extensions
バージョン履歴
ver.1.3.1 (2024/09/29)
- ソート対象のプロパティ名を入れ子(プロパティのプロパティの…のプロパティ)にできるようにした。
- SortableGridViewColumnにSortingMemberPathを追加した。この項目に何も設定していない場合(nullの場合)は今まで通りDisplayMemberBindingsのパスをソートのキーとして扱うが、この項目を設定した場合はこれをキーとしてソートされる。
- ListViewViewModel (ReadOnlyUIObservableCollectionを継承しているクラス)でIndexerとCountのPropertyChangedイベントが発生しなかった不具合を修正
- ListViewの子要素にComboBoxなどがあると、その選択が変化したときに例外が発生する不具合を修正
ver.1.3.0 (2024/09/23)
- 選択項目の同期をListViewSelectedItemsActionからSelectedItemsSync.Source添付プロパティ経由で行うようにした。
- Obsolete指定していたSortedHeaderを削除
ver.1.2.0 (2024/09/03)
- IReadOnlySortableObservableCollectionインターフェースとReadOnlySortableObservableCollectionクラスを追加
- ISortableObservableCollectionインターフェースはIReadOnlySortableObservableCollectionインターフェースを継承するようにした
- ListViewViewModelのコンストラクタに与えるソースコレクションをIReadOnlySortableObservableCollectionにした
- ListViewViewModelに単一の型引数を取るオーバーロードを追加
ver.1.1.0 (2024/08/31)
- ターゲットを.NET Framework 4.5.2 / .NET Core 3.1 / .NET 6に変更
- ListViewのヘッダーサポートを強化
- SortableGridViewColumnHeader、SortableGridViewColumnを追加
- SortedHeaderをObsolete指定にした
- ISortableObservableCollectionのSortメソッドの引数を変更、古いメソッドはObsolete指定にした
- コードのリファクタリング、Nullableの有効化、単体テストの追加など
ver.1.0.1 (2018/03/24)
- Obsoleteに指定していた非同期アクセス非サポートのクラスを削除
- SyncedObservableCollectionが実装する非ジェネリックインターフェイス(IList, ICollectionなど)を明示的なインターフェイスの実装に変更
ver.1.0.0 (2017/11/26)
- 正式リリース
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net6.0-windows7.0 is compatible. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.1 is compatible. |
.NET Framework | net452 is compatible. net46 was computed. net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
-
.NETCoreApp 3.1
- Microsoft.Xaml.Behaviors.Wpf (>= 1.1.39)
-
.NETFramework 4.5.2
- Microsoft.Xaml.Behaviors.Wpf (>= 1.1.39)
-
net6.0-windows7.0
- Microsoft.Xaml.Behaviors.Wpf (>= 1.1.39)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.3.1 | 98 | 9/29/2024 |
1.3.0 | 103 | 9/22/2024 |
1.2.0 | 105 | 9/3/2024 |
1.1.0 | 112 | 8/31/2024 |
1.0.1 | 1,193 | 3/24/2018 |
1.0.0 | 936 | 11/26/2017 |
1.0.0-beta4 | 710 | 11/13/2017 |
1.0.0-beta3 | 725 | 10/25/2017 |
1.0.0-beta2 | 719 | 10/24/2017 |
1.0.0-beta1 | 1,068 | 12/17/2015 |
- Changed nested property name to be accepted as a sorting key.
- Added "SortingMemberPath" Property in SortableGridViewColumn which is treated as a path of a soring key. The value of DisplayMemberBindings property is used as before if this property is not set.
- Fixed PropertyChanged event is not fired when the indexer and Count property are changed on the class inherits ReadOnlyUIObservableCollection including ListViewViewModel.
- Fixed ArgumentException is thrown if there is a ComboBox and so on in the element of ListView and its selection is changed.