スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

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

DataGrid用ViewModelクラスを実装した(弐)。の続き。
DaraGridのイベントからセルの情報をVMで活用する。(壱)
や、
DaraGridのイベントからセルの情報をVMで活用する。(弐)
で作った添付プロパティと連携するためのプロパティをDataGridVMに持たせる。
定義、インタンス生成、後始末、実行用メソッドまで記述した時点で、↓のようになった。

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 DataGridVM() {
/* 省略 */

//各コマンド
this.cellClickedCommand_ = new RelayCommand(ExecuteCellClickedCommand);
this.cellChangedCommand_ = new RelayCommand(ExecuteCellChangedCommand);
this.selectionChangedCommand_ = new RelayCommand(ExecuteSelectionChangedCommand);
this.doubleClickedCommand_ = new RelayCommand(ExecuteDoubleClickedCommand);
return;
}

#endregion


#region プロパティ(コマンド)

/// <summary>セルクリック用コマンド</summary>
private RelayCommand cellClickedCommand_;

/// <summary>
/// セルクリック用コマンドを取得します。
/// </summary>
public ICommand CellClickedCommand {
get {return cellClickedCommand_;}
}

/// <summary>カレントセル変更用コマンド</summary>
private RelayCommand cellChangedCommand_;

/// <summary>
/// カレントセル変更用コマンドを取得します。
/// </summary>
public ICommand CellChangedCommand {
get {return cellChangedCommand_;}
}

/// <summary>セル選択変更用コマンド</summary>
private RelayCommand selectionChangedCommand_;

/// <summary>
/// セル選択変更用コマンドを取得します。
/// </summary>
public ICommand SelectionChangedCommand {
get {return selectionChangedCommand_;}
}

/// <summary>セルダブルクリック用コマンド</summary>
private RelayCommand doubleClickedCommand_;

/// <summary>
/// セルダブルクリック用コマンドを取得します。
/// </summary>
public ICommand CellDoubleClickedCommand {
get {return doubleClickedCommand_;}
}

#endregion

#region UIElementVMメンバ

/// <summary>
/// 内部リソースを破棄します。
/// </summary>
/// <param name="disposing">false:アンマネージドのみ破棄します。</param>
protected override void OnDispose(bool disposing) {
if (this.IsDisposed) {
return;
}

base.OnDispose(disposing);

if (disposing) {
//後始末
if (cellClickedCommand_ != null) {
cellClickedCommand_.Clear();
cellClickedCommand_ = null;
}

if (doubleClickedCommand_ != null) {
doubleClickedCommand_.Clear();
doubleClickedCommand_ = null;
}

if (cellChangedCommand_ != null) {
cellChangedCommand_.Clear();
cellChangedCommand_ = null;
}

if (selectionChangedCommand_ != null) {
selectionChangedCommand_.Clear();
selectionChangedCommand_ = null;
}
}
}

#endregion

#region コマンド実行用メソッド

/// <summary>
/// セルクリック用コマンド実行メソッド
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
private void ExecuteCellClickedCommand(object parameter) {
return;
}

/// <summary>
/// カレントセル変更用コマンド実行メソッド
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
private void ExecuteCellChangedCommand(object parameter) {
return;
}

/// <summary>
/// セル選択変更用コマンド実行メソッド
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
private void ExecuteSelectionChangedCommand(object parameter) {
return;
}

/// <summary>
/// セルダブルクリック用コマンド実行メソッド
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
private void ExecuteDoubleClickedCommand(object parameter) {
return;
}

#endregion
}
}
これをXAML側で添付プロパティと連携させる。
<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tw="http://schemas.tawamuredays.jp/wpf/gui"
Title="MainWindow" Height="350" Width="525">
<tw:TawamureContents>
<DataGrid DataContext="{Binding BookmarkListVM}"
ItemsSource="{Binding ItemsSource}"
tw:DataGridExtender.CellChangedCommand="{Binding CellChangedCommand}"
tw:DataGridExtender.CellClickedCommand="{Binding CellClickedCommand}"
tw:DataGridExtender.SelectionChangedCommand="{Binding SelectionChangedCommand}"
tw:DataGridExtender.CellDoubleClickedCommand="{Binding CellDoubleClickedCommand}"
CanUserAddRows="True">
<DataGrid.Columns>
<--省略-->
</DataGrid.Columns>
</DataGrid>
</tw:TawamureContents>
</Window>
これでセルのイベント発生に対して、指定のコマンドが実行されるようになる。
メモ:
 ・編集可能列では、CellChanged, SelectionChangedは発生するが、CellClicked, CellDoubleClickedは発生しない。
 (クリックした瞬間に編集が始まるので、セルに対するクリックするというイベントが発生してなさそう)。
 ・読み取り専用に切り替えると上記イベントは発生する。
  ○任意のセルから別のセルをクリックする(別の行)。
   SelectionUnit=FullRow
   →CellChanged→SelectionChanged→終了
   SelectionUnit=(Cell | CellOrRowHeader)
   →CellChanged→終了
  ○同じセルをクリックする。
   CellClicked→終了
  ○同じセルをクリックする。
   CellClicked→終了
  ○任意のセルから別のセルをダブルクリックする。
   SelectionUnit=FullRow
   →CellChanged→SelectionChanged→CellDoubleClicked→終了
   SelectionUnit=(Cell | CellOrRowHeader)
   →CellChanged→CellDoubleClicked→終了
   ※ブレイクポイントで止めるとCellDoubleClickedは発生しない。
  ○キーボードによる移動の際は、CellChangedか、SelectionChangedしか発生しない。
   当たり前といえば、当たり前の話。
 ・各コマンドのパラメータ
  ○CellChangedCommand, CellDoubleClickedCommand, CellClickedCommand:
20121204_1

   Tuple
    Item1:行インデックス(0~)
    Item2:列インデックス(0~)
    Item3:その行のDataContextとなるItemオブジェクト
    Item4:列にバインドされているプロパティ名
    Item5:true:行全体が選択中, false:セルだけ選択中
   注意:CanUserAddRow=Trueの時に出てくる一番↓の新規行をクリックした時、Item3は、まだデータが作られていないので、「NewItemPlaceHolder」という文字列が返されてくる。objectで受け取るので、例外は発生しない。

  ○SelectionChangedCommand:
20121024_2

   Tuple
    Item1:選択に追加されたアイテムリスト
    Item2:選択に除外されたアイテムリスト
    Item3:true:キー押下による移動, false:それ以外による移動
 ・SelectonChangedは、DataGridが持つ選択機能に依存する。
  SelectionUnitをCellにすると発生しない。
  CellOrRowHeaderにすると、行ヘッダをクリックした前後のアクション時に発生する。
  FullRowは、常々発生する。

コマンドのパラメータから得られる情報を元に更に実装していく。
続く。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。