DataGrid用ViewModelクラスを実装した(四)。

DataGrid用ViewModelクラスを実装した(参)。で実装したコマンドを使って、カレントアイテム(太枠があるセル)の情報をプロパティとして持たせる。
なぜ、そんな実装になるか?というと、DataGrid自身に、CurrentItemというプロパティがあり、そいつとバインディングする事は可能だけども、このプロパティは、フォーカスがDataGridから外れた瞬間にnullになるという癖(仕様)があるため、カレントセルのアイテムに対して、何かをしようとボタンを押した瞬間にnullになってしまう。なので、直接バインディングせずに、カレントセルの移動イベントをコマンドで受け取る事で、カレントアイテムの情報を得ることにした。
using System;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Windows.Data;
using System.Windows.Input;

namespace TawamureDays.ViewModels {

using TawamureDays.Container;
using TawamureDays.Commands;

/// <summary>
/// データグリッド用ViewModelクラス
/// </summary>
public class DataGridVM<TItem> : UIElementVM {

#region プロパティ

/// <summary>
/// 現在のアイテム(カレントセルがある行のアイテム)を取得|設定します。
/// </summary>
public TItem CurrentItem {
get; protected set;
}

#endregion
}
}
これだけでは、どうにもならないなので、CellChangedイベント用のコマンドを実装する。

#region 内部メソッド

/// <summary>
/// カレントセル変更用コマンド実行メソッド
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
protected virtual void ExecuteCellChangedCommand(object parameter) {
var cellInfo = parameter as Tuple<int, int, object, string, bool>;

if (cellInfo != null && cellInfo.Item3 is TItem) {
this.CurrentItem = (TItem)cellInfo.Item3;
} else {
this.CurrentItem = default(TItem);
}

return;
}

#endregion
セルを移動させるたびにCurrentItemは更新されることになる。フォーカスが外れても、CellChangedは発生しないので、nullにはならない。
なお、CurrentItemをnullにせず、default(TItem)に初期化するのは、Genericの型に何の制限も設けていない(値型をジェネリックパラメータに設定することもできる)ので、上記実装では、nullに設定できない。以下のように参照型に限定するなら、nullに設定できる。

/// <summary>
/// データグリッド用ViewModelクラス
/// </summary>
public class DataGridVM<TItem> : UIElementVM where TItem : class {
}

DataGridのCurrentCellが、「フォーカスが外れる→nullになる」という仕様がなければ、実装する必要ないんだけど。WPF4.5ではどうなんんだろ?変わらなければ、そのまま使い続けるしかないなぁ。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m