作ったら実際に使ってみないと何とも言えない。

DataGrid用のViewModelを作ったので、早速使ってみる。仕事でそうだったんだけど、こういうのは実際に使ってみてナンボなんだ。それも自分以外の人に。他人に使ってもらって、バグとか問題点とかを挙げてもらう事で継続的なブラッシュアップができる。もちろん、そういう事(他人にデバッグしてもらう事)を前提に実装するという意味ではない。
○DataGridのアイテムとなるクラス
namespace TawamureDays {

using TawamureDays.ViewModels;

/// <summary>
/// ブックマークリストアイテム用ViewModelクラス
/// </summary>
public class BookmarkVM : BaseViewModel {

#region プロパティ

/// <summary>URL</summary>
private string url_;

/// <summary>
/// URLを取得|設定します。
/// </summary>
public string Url {
get {return url_;}
set {
if (url_ != value) {
url_ = value;
this.NotifyPropertyChanged("Url");
}
}
}

/// <summary>タイトル</summary>
private string title_;

/// <summary>
/// タイトルを取得|設定します。
/// </summary>
public string Title {
get { return title_; }
set {
if (title_ != value) {
title_ = value;
this.NotifyPropertyChanged("Title");
}
}
}

#endregion
}
}
名前の通り、ブックマーク系の情報を持たせる為のクラス。とりあえず、URLとタイトルだけ。チェック無し。
○ウィンドウ用ViewModel
using System;
using System.Windows;

namespace TawamureDays {

using TawamureDays.ViewModels;

/// <summary>
/// ウィンドウ用ViewModelクラス
/// </summary>
public class MainWindowVM : BaseWindowVM {
}
}
DataGrid用VM型のプロパティを追加して、コンストラクタでインスタンスを生成する。

#region プロパティ

/// <summary>
/// ブックマークリストを取得します。
/// </summary>
public DataGridVM<BookmarkVM> BookmarkListVM {
get; private set;
}

#endregion

#region コンストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public MainWindowVM() {
this.BookmarkListVM = new DataGridVM<BookmarkVM>();
//各アイテムのプロパティ値変更イベントにハンドラを登録します。
this.BookmarkListVM.ItemPropertyChanged +=
new System.ComponentModel.PropertyChangedEventHandler(
BookmarkListVM_ItemPropertyChanged);
return;
}

#endregion
各アイテムのプロパティ値変更イベント用ハンドラ

#region イベントハンドラ

/// <summary>
/// ブックマークリストアイテムプロパティ値変更イベントハンドラ
/// </summary>
/// <param name="sender">イベントハンドラ</param>
/// <param name="e">イベント引数</param>
private void BookmarkListVM_ItemPropertyChanged(object sender,
System.ComponentModel.PropertyChangedEventArgs e) {
var itemVM = sender as BookmarkVM;
var changedProperty = e.PropertyName;
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}">
<DataGrid.Columns>
<DataGridTextColumn Header="URL"
tw:DataGridExtender.ColumnId="ColUrl"
Binding="{Binding Url}"
Width="4*"
/>
<DataGridTextColumn Header="TITLE"
tw:DataGridExtender.ColumnId="ColTitle"
Binding="{Binding Title}"
Width="6*"
/>
</DataGrid.Columns>
</DataGrid>
</tw:TawamureContents>
</Window>
DataGridに対する設定が少ない。単にApp.xaml側で設定しただけ。

<Style TargetType="DataGrid">
<Setter Property="AutoGenerateColumns" Value="False"/>
<Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
<Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Standard"/>
</Style>
とりあえず、列生成無しとUI仮想化設定のみ。
○コード側
public partial class MainWindow : Window {

public MainWindow() {
InitializeComponent();
this.DataContext = new MainWindowVM();
return;
}
}
DataContextに設定しないと意味が無い。
○実行
20121007_1
CanUserAddRows=true、CanUserDeleteRows=trueなので、ItemsSourceに何も設定しなくても、空の1行が表示されている。
画面から追加も削除もできる。
追加は、編集モード(F2キー)にして、Enterキー押すと、下に一行追加される。
削除は、行ヘッダをクリックして、Delキーを押す。
○メモ
・CollectionChangedイベントハンドラ内で、ブレークボタンを掛けたところ、最初に現れる空の1行は、その時点ではリストに追加されておらず、編集開始とともにリストに追加される動きになっている(編集を始めようとした瞬間にブレイクされた)。
・その後も一番下に現れる行は、削除できない(Delキーが効かない)。
・上の実装では、アイテム変更(編集確定時)にハンドラに通知される。
・ただし、変更通知のトリガーは、Enterキー押下、あるいは編集行からのフォーカス喪失となっている感じ。
 →Urlを編集後、マウスで同じ行のタイトル用セルをクリックしても変更通知は発生しない。Tabキーによる移動でも発生しない。
 →DataGridは編集モードが2段階あり、行編集モードとセル編集モードがある。
  ・セルの編集モードが終わっても、行の編集モードは終わっていない。
  ・行からフォーカスを移動させるか、Enterキーを押すと、行の編集モードが終わる(変更の確定)。
  ・行の編集モードが終わってから、変更イベントが通知される。
 →セルの編集・即プロパティ値変更通知を行おうと思うなら、一工夫必要になる。
・プロパティのsetから、NotifyPropertyChangedメソッド呼び出し部分をコメント化すると、イベントは通知されなくなった。ただし、変更は反映されている。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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