IEditableCollectionViewの登録・更新・削除のときの動きを今までさらっと見てみた。
IEditableCollectionViewの動き自体は、ちゃんと見てみると何も難しくないと思う。
(きちんと連携させるためのIEditableObjectの実装がめんどくさいことを除いて)
ということで(どういうことで?)今回は、今まで避けてきたIEdltableCollectionViewのNewItemPlaceholderPositionプロパティを見てみようと思う。
NewItemPlaceholderPositionは、新規追加が可能なUIを構築するときに、その場所を提供するためのダミーのオブジェクトを何処に追加するかということが設定できる。
DataGridViewで、追加を有効にしたときに一番最後の行に表示される空の行みたいなのを提供するためのものっぽいです。
コンソールからでも、ListCollectionViewクラスのCountプロパティを通じて存在を確認することは出来るけど、GUIで見たほうがてっとり早いので、今回はGUIのプロジェクトを作ってやってみようと思う。
新規作成で、NewItemPlaceというプロジェクトを作って、いつものPersonクラスを定義する。
namespace NewItemPlace
{
public class Person
{
public string Name { get; set; }
public override string ToString()
{
return base.ToString() + ": " + this.Name;
}
}
}
ToStringのオーバーライドは、後でListBoxに表示したときにDataTemplateをこさえるのがめんどくさいから手抜きしています。
さて、これのListCollectionViewのインスタンスを作ってWindowのDataContextに突っ込んでおく。
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Data;
namespace NewItemPlace
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
// IEditableCollectionViewを作って
var people =
Enumerable.Range(1, 5).Select(i =>
new Person { Name = "田中 太郎" + i }).ToList();
var view = (IEditableCollectionView)CollectionViewSource.GetDefaultView(people);
// DataContextに設定
DataContext = view;
}
}
}
XAML側は、さくっとListBoxを設置する。
<Window x:Class="NewItemPlace.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<ListBox ItemsSource="{Binding}" />
</Grid>
</Window>
実行すると、PersonのToStringの結果がずらっと表示される。
これに、NewItemPlaceholderPositionプロパティの値をいじくって実行結果を見ていく。
コード的には、以下のような感じになる。
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Data;
namespace NewItemPlace
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
// IEditableCollectionViewを作って
var people =
Enumerable.Range(1, 5).Select(i =>
new Person { Name = "田中 太郎" + i }).ToList();
var view = (IEditableCollectionView)CollectionViewSource.GetDefaultView(people);
// ここでセットしますぞ!!
view.NewItemPlaceholderPosition = NewItemPlaceholderPosition.None;
// DataContextに設定
DataContext = view;
}
}
}
NewItemPlaceholderPositionプロパティは、NewItemPlaceholderPosition列挙体の値を代入することが出来ます。
NewItemPlaceholderPosotion列挙体は、None(デフォルト),AtEnd,AtBeginningの3つの値が定義されています。Noneのときの結果は、上で示した実行結果なので、残りの値にしたときの実行結果を以下に示します。
AtEnd
AtBeginning
最初と最後に、NewItemPlaceholderがくっついてるのが見て取れる。
ここに、新規登録用のUIを用意して、ごにょごにょするといった感じに使うのだろう。
ただ、これにきっちり対応したものを作ろうと思うと大変そうな気がする。
おとなしくWPF ToolkitのDataGridが完成するのを待つのがよろしいような気がする今日この頃でした。