かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

わんくまBlogが不安定になったため、前に書いてたはてなダイアリーにメインを移動します。
かずきのBlog@Hatena
技術的なネタは、こちらにも、はてなへのリンクという形で掲載しますが、雑多ネタははてなダイアリーだけに掲載することが多いと思います。
コメント
プログラマ的自己紹介
お気に入りのツール/IDE
プロフィール
経歴
広告
アクセサリ

書庫

日記カテゴリ

[WPF][C#]IEditableCollectionView その2

[C#][WPF]IEditableCollectionViewの動きを見てみよう

前回で、IEditableCollectionViewにどんなメソッドがあるかを見ていった。
今回は、それぞれのメソッドの動きを見ていこうと思う。

とりあえずいつもどおり調査のための下準備のプロジェクトを新規作成する。作成するプロジェクトは、コンソールアプリケーションで、名前をEditableCollectionViewEduにした。

WPF関連のクラスを使うので、PresentationCore, PresentationFramework, WindowsBaseの3つを参照設定に追加する。
そして、いつものPersonクラスを追加しておく。
今回はIEditableCollectionViewの動きを見るだけなのでNameプロパティだけにした。

public class Person
{
    public string Name { get; set; }
    public override string ToString()
    {
        return "Person: Name = " + Name;
    }
}

ついでに、IEditableObjectを実装させた阪のPersonクラスも定義しておく。Personを継承してさくっとね。

public class EditablePerson : Person, IEditableObject
{
    private EditablePerson back;


    #region IEditableObject メンバ

    public void BeginEdit()
    {
        Console.WriteLine("# BeginEdit Called: " + this);
        back = (EditablePerson)MemberwiseClone();
    }

    public void CancelEdit()
    {
        Console.WriteLine("# CancelEdit Called: " + this);
        if (back == null)
        {
            return;
        }
        Name = back.Name;
    }

    public void EndEdit()
    {
        Console.WriteLine("# EndEdit Called: " + this);
        back = null;
    }

    #endregion
}

次に、Mainメソッドにテスト用のPersonクラスのリストを作って、CollectionViewSourceのGetDefaultViewメソッドでListCollectionViewのインスタンスを取得する。

static void Main(string[] args)
{
    // テスト用のListCollectionViewを作成
    var people = Enumerable.Range(1, 10).Select(i =>
        new Person { Name = "田中 太郎" + i }).ToList();
    var view = CollectionViewSource.GetDefaultView(people);

    // 型の確認
    Console.WriteLine(view.GetType());
}

実行すると、「System.Windows.Data.ListCollectionView」と表示される。
このListCollectionViewがIEditableCollectionViewを実装している。こいつをIEditableCollectionViewにキャストして色々調査していこうと思う。

とりあえず、編集系のメソッドとプロパティの動きを見てみるために下のようなプログラムを書いた。

// テスト用のListCollectionViewを作成
var people = Enumerable.Range(1, 10).Select(i =>
    new Person { Name = "田中 太郎" + i }).ToList();
var view = CollectionViewSource.GetDefaultView(people);

// IEditableCollectionViewにキャストするよ
var editableView = (IEditableCollectionView)view;

// 編集系
// とりあえず最初の人のインスタンスとっとく
var targetPerson = people[0];

// 編集前のIEditableCollectionViewの状態を表示
Dump("編集前", editableView);
// EditItemで編集中の状態にする
Console.WriteLine("BeginEdit 呼出し前");
editableView.EditItem(targetPerson);
Console.WriteLine("BeginEdit 呼出し後");

// 編集中のIEditableCollectionViewの状態を表示
Dump("編集中", editableView);

// 確定してみる
Console.WriteLine("CommitEdit 呼出し前");
editableView.CommitEdit();
Console.WriteLine("CommitEdit 呼出し後");

// 確定後のIEditableCollectionViewの状態を表示
Dump("確定後", editableView);

途中で使ってるDumpメソッドは、IEditableCollectionViewの編集に関係しそうなプロパティを表示する。

private static void Dump(string msg, IEditableCollectionView editableView)
{
    Console.WriteLine("------------------------------");
    Console.WriteLine("  " + msg);
    Console.WriteLine("  IEditableCollectionView");
    Console.WriteLine("    :CanCencelEdit: " + editableView.CanCancelEdit);
    Console.WriteLine("    :IsEditingItem: " + editableView.IsEditingItem);
    Console.WriteLine("    :CurrentEditItem: " + editableView.CurrentEditItem);
}

色々書いているけど、このプログラムの目的は、EditItemの呼出し前後のプロパティの変化と、CommitEdit呼出し後のプロパティの変化を観察するのが目的です。
予想としては、この例ではPersonオブジェクトはIEditableObjectを実装してないので、キャンセルとかは出来ないようになってるけど、編集中かどうかという状態管理だけは、してくれてるんじゃないかな?といった感じ。
実際に、実行してみると、下のような結果になりました。

------------------------------
  編集前
  IEditableCollectionView
    :CanCencelEdit: False
    :IsEditingItem: False
    :CurrentEditItem:
BeginEdit 呼出し前
BeginEdit 呼出し後
------------------------------
  編集中
  IEditableCollectionView
    :CanCencelEdit: False
    :IsEditingItem: True
    :CurrentEditItem: Person: Name = 田中 太郎1
CommitEdit 呼出し前
CommitEdit 呼出し後
------------------------------
  確定後
  IEditableCollectionView
    :CanCencelEdit: False
    :IsEditingItem: False
    :CurrentEditItem:

編集前段階では、キャンセルできない、編集中ではない、編集中のアイテムも無いという状態です。(当然だよね)
そして、BeginEditを呼び出すと、キャンセルは出来ない、編集中の状態である、編集対象は田中 太郎1さんです、といった状態に変化している。

キャンセルが出来ないのは、PersonクラスがIEditableObjectではないからということになる。

んで、CommitEditを呼び出すと、最初の状態に戻ってる。
キャンセルが出来ないのを確認するために、プログラムにちょこっと手を入れて下のようにしてみた。

// テスト用のListCollectionViewを作成
var people = Enumerable.Range(1, 10).Select(i =>
    new Person { Name = "田中 太郎" + i }).ToList();
var view = CollectionViewSource.GetDefaultView(people);

// IEditableCollectionViewにキャストするよ
var editableView = (IEditableCollectionView)view;

// 編集系
// とりあえず最初の人のインスタンスとっとく
var targetPerson = people[0];

// 編集開始
editableView.EditItem(targetPerson);

Console.WriteLine("編集対象の人のデータ: " + targetPerson);

Console.WriteLine("変更後の名前を入力してください");
Console.Write("# >");

// 名前を変更
targetPerson.Name = Console.ReadLine();

Console.WriteLine(targetPerson + "にしてよろしいですか?Y/N");
Console.Write("# >");

string answer = Console.ReadLine();
if (answer == "Y")
{
    // Yなら確定!
    editableView.CommitEdit();
}
else
{
    // Y以外ならキャンセル
    editableView.CancelEdit();
}

// 最終結果を表示
Console.WriteLine("編集後の値: " + targetPerson);

コレクションに10個もデータを突っ込みつつ、使ってるのが最初の1つだけというのが気になるけど気にしないで実行。

編集対象の人のデータ: Person: Name = 田中 太郎1
変更後の名前を入力してください
# >田中 一郎
Person: Name = 田中 一郎にしてよろしいですか?Y/N
# >Y
編集後の値: Person: Name = 田中 一郎

これは問題ない。次に編集結果をキャンセルするような操作をしてみると…

編集対象の人のデータ: Person: Name = 田中 太郎1
変更後の名前を入力してください
# >田中 麻呂
Person: Name = 田中 麻呂にしてよろしいですか?Y/N
# >N

ハンドルされていない例外: System.InvalidOperationException: CancelEdit は現在の
編集項目に対してサポートされていません。
   場所 System.Windows.Data.ListCollectionView.CancelEdit()
   場所 EditableCollectionViewEdu.Program.Main(String[] args) 場所 C:\Users\Kazu
ki\Documents\Visual Studio 2008\Projects\EditableCollectionViewEdu\EditableColle
ctionViewEdu\Program.cs:行 49

という例外が出てしまう。どうやら、キャンセルできないものをキャンセルしようとすると例外になるみたいです。気をつけないと。

次に、PersonをEditablePersonに差し替えてみる。

// テスト用のListCollectionViewを作成
var people = Enumerable.Range(1, 10).Select(i =>
    new EditablePerson { Name = "田中 太郎" + i }).ToList();

これで、キャンセルも出来るはず!?ということで実行。とりあえず、CommitEditを通るオペレーションで試す。

# BeginEdit Called: Person: Name = 田中 太郎1
編集対象の人のデータ: Person: Name = 田中 太郎1
変更後の名前を入力してください
# >大田
Person: Name = 大田にしてよろしいですか?Y/N
# >Y
# EndEdit Called: Person: Name = 大田
編集後の値: Person: Name = 大田

問題ない。次はCancelEditの場合。

# BeginEdit Called: Person: Name = 田中 太郎1
編集対象の人のデータ: Person: Name = 田中 太郎1
変更後の名前を入力してください
# >わんくま 太郎
Person: Name = わんくま 太郎にしてよろしいですか?Y/N
# >N
# CancelEdit Called: Person: Name = わんくま 太郎
編集後の値: Person: Name = 田中 太郎1

お~ちゃんとキャンセルされてる!!

投稿日時 : 2008年12月28日 14:23

Feedback

# welded ball valve 2012/10/18 23:36 http://www.jonloovalve.com/Full-welded-ball-valve-

Absolutely indited articles , regards for entropy.

# グッチ バッグ 人気 2012/11/07 18:48 http://www.guccifactorystore.com/%E3%82%B0%E3%83%8

はじめまして。突然のコメント。失礼しました。

# Nike Air Jordan New School 2012/12/08 0:28 http://suparjordanshoes1.webs.com/

I conceive this web site has got some very wonderful information for everyone. "The foundation of every state is the education of its youth." by Diogenes.

# longchamps 2012/12/14 20:41 http://www.longchampbagoutlet.info/category/longch

i commend you onto your great content and articles and wonderful topic choices.

# sac longchamp le pliage 2012/12/15 15:41 http://www.soldesacslongchamp.info/category/longch

make these folks red with a yellow mount!!

# burberryuksale.info 2012/12/15 22:53 http://www.burberryuksale.info

make him or her red using a yellow indy!!

# sac longchamps pliage 2012/12/16 17:53 http://www.saclongchampachete.com/category/sac-lon

I do not know... there's anything tacky approximately owning Ferrari branded stuff like this.. unless therefore, you own a proper Ferrari.

# burberry 2013 2012/12/17 2:46 http://www.burberryuksale.org

The only individuals that would take a look good making use of these fugly things is going to be Ferrari pit crew while in the pits:D

# sac longchamp soldes 2012/12/17 20:42 http://www.saclongchampachete.info/category/longch

The fashion don't retract flat and Philips doesn't offer a travel pouch inside the package.

# burberry echarpe 2012/12/18 2:05 http://burberrypascher.monwebeden.fr

We found plenty of great DVDs that any of us were excited to see again. Over the lifetime of two months.

# sacs burberry pas cher 2012/12/21 3:37 http://sacburberrysoldesfr.webnode.fr

If a person's photostream is made up of photos which will - whether or not good or not -- triggered any spirited comments¡ä bond.

# コピーブランド, 2018/01/22 1:16 hodihqvf@msn.com

新舗 新型-大注目!

★ 腕時計、バッグ、財布、ベルト、ジュエリー、コピーブランド
★経営理念:
1.最も合理的な価格で商品を消費者に提供致します.
2.弊社の商品品数大目で、商品は安めです]!★商品現物写真★
3.数量制限無し、一個の注文も、OKです.
4.1個も1万個も問わず、誠心誠意対応します.
5.不良品の場合、弊社が無償で交換します.
以上宜しくお願いします。
不明点、疑問点等があれば、ご遠慮なく言って下さい.
以上 よろしくお願いいたします。

# Today, I went to the beachfront with my kids. I found a sea shell and gave it to my 4 year old daughter and said "You can hear the ocean if you put this to your ear." She placed the shell to her ear and screamed. There was a hermit crab inside 2019/05/07 13:44 Today, I went to the beachfront with my kids. I fo

Today, I went to the beachfront with my kids. I found a sea shell and gave it
to my 4 year old daughter and said "You can hear the ocean if you put this to your ear." She placed the shell to her ear and
screamed. There was a hermit crab inside and it pinched her ear.
She never wants to go back! LoL I know this is entirely off
topic but I had to tell someone!

# Spot on with this write-up, I actually think this amazing site needs far more attention. I'll probably be back again to read through more, thanks for the information! 2019/08/15 3:41 Spot on with this write-up, I actually think this

Spot on with this write-up, I actually think this amazing site needs
far more attention. I'll probably be back again to read through more, thanks for the information!

# Illikebuisse iuums 2021/07/04 1:55 pharmaceptica

hidroxicloroquina 400mg https://pharmaceptica.com/

# re: [WPF][C#]IEditableCollectionView ??2 2021/07/23 17:02 hydrocholoroquine

is chloroquine available over the counter https://chloroquineorigin.com/# hydro chloroquine

# umqrdhyliddq 2022/05/06 23:34 cxpfmd

hydroxychloriqine https://keys-chloroquinehydro.com/

# chloroquine phosphate generic name 2022/12/25 18:47 MorrisReaks

https://hydroxychloroquinex.com/ aralen online canada

# ロレックス レディース 文字盤交換 2023/12/06 10:58 fuyjvrhti@live.com

商品が届くまでは画像では判断できないような状態が悪い物が届かないか心配でしたが、杞憂でした。
説明通りの品が届き大変満足しております。
配送もとても迅速で、こちらのミスで配送指定日時の変更をお願いしましたが、快く調整して下さいました。
梱包もとても丁寧で完璧な状態で届きました。
いい買い物ができました。
どうもありがとうございました。
ロレックス レディース 文字盤交換 https://www.etanoob.com/category/215/4-key=3.htm

タイトル
名前
Url
コメント