C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ObservableCollection<T>の更新方法


(過去ログ 69 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■40164 / inTopicNo.1)  ObservableCollection<T>の更新方法
  
□投稿者/ NICO (5回)-(2009/08/20(Thu) 20:32:02)

分類:[.NET 全般] 

お世話になっております。

WPFで、ObservableCollection<T>型の変数をBindingしています。
この中身を変更したいのですが、以下のようなエラーができます。
場所を指定して変更することは可能でしょうか?

Listのindexを指定して、削除(RemoveAt(index))し、削除したところに挿入(Insert(index,new構造体))することで、
なんとか実現できましたが、構造体の1つのメンバだけを変更したいので、他の案を探しています。

どうぞよろしくお願いいたします。

--
エラー 1 変数ではないため、'System.Collections.ObjectModel.Collection<Test.Controller.TestController.Data>.this[int]' の戻り値を変更できません

---------
プロパティ
private ObservableCollection<Data> list = new ObservableCollection<Data>();
public ObservableCollection<Data> List{ get { return list ; } set { list = value; OnPropertyChanged("List"); } }


構造体
public struct Data
{
 public string path;
public string text;

public string Path { get { return path; } set { path = value; } }
public string Text { get { return text; } set { text = value; } }
}

コンストラクタ
public TestController()
{
    List.Add(new Data() { path = @"C:\work\A.bmp", text = "A"});
    List.Add(new Data() { path = @"C:\work\B.bmp", text = "B"});
    List.Add(new Data() { path = @"C:\work\C.bmp", text = "C"});
    List.Add(new Data() { path = @"C:\work\D.bmp", text = "D"});
}

更新メソッド
public void change()
{
  List[0].Text = "change!";   ★ここでエラーになります。
}


引用返信 編集キー/
■40173 / inTopicNo.2)  Re[1]: ObservableCollection<T>の更新方法
□投稿者/ Hongliang (451回)-(2009/08/20(Thu) 21:06:42)
> Listのindexを指定して、削除(RemoveAt(index))し、削除したところに挿入(Insert(index,new構造体))することで、
わざわざ Remove して Insert しなくても、
var obj = list[x];
// obj を操作
list[x] = obj;
とすれば良いと思いますけど。

> なんとか実現できましたが、構造体の1つのメンバだけを変更したいので、他の案を探しています。
まず、Data 型は本当に struct でなければならないものなのでしょうか。
特に理由がないのなら、class を使うことをお勧めします。
struct であるかぎり、list[x].Hoge = ... なんてコードは書けません。list から取得した時点でコピーが作られるためです。
// C# struct class とかで検索すれば理由はすぐ見つかるでしょう。

また、ObservableCollection<T> は要素の変更は通知できますが、その要素のプロパティの変更は埒外です。
要素のプロパティの変更を通知するためには、要素(この場合だと Data)に INotifyPropertyChanged インターフェイスを実装させる必要があります。
// DependencyObject からの派生にして依存関係プロパティでも良いですが。
引用返信 編集キー/
■40194 / inTopicNo.3)  Re[2]: ObservableCollection<T>の更新方法
□投稿者/ 倉田 有大 (702回)-(2009/08/21(Fri) 01:17:22)
C#でstructの出番は、アンマネージとのやり取りぐらいかなあ。

public string Path { get { return path; } set { path = value; } }

public string Path {set; get;}
この書き方は知ってます?
引用返信 編集キー/
■40200 / inTopicNo.4)  Re[3]: ObservableCollection<T>の更新方法
□投稿者/ kazuto (16回)-(2009/08/21(Fri) 10:15:47)
kazuto さんの Web サイト
Hongliangさんも仰っておりますが

>WPFで、ObservableCollection<T>型の変数をBindingしています。
>この中身を変更したいのですが、以下のようなエラーができます。
>場所を指定して変更することは可能でしょうか?

これと

>更新メソッド
>public void change()
>{
>  List[0].Text = "change!";   ★ここでエラーになります。
>}

これではObservableCollection<T>を使用した変更通知を行う部分の意味合いが異なります。

前回のスレにて張ったリンク先を良くお読みになられてはいかがでしょうか?
リンク先をお読みになられれば実現したいと思われる

List[0].Text = "changed!";

の実装方法が分かると思います。

引用返信 編集キー/
■40206 / inTopicNo.5)  Re[4]: ObservableCollection<T>の更新方法
□投稿者/ NICO (6回)-(2009/08/21(Fri) 11:09:57)
Hongliang様
直接書き換えようと必死になりすぎでいました。
classにして、実装できました。
ObservableCollectionの説明もありがとうございました。
よくわかりました。

ありがとうございました。


倉田 有大様
お世話になっております。
アドバイスありがとうございました。

>>>>この書き方は知ってます?
知らなかったです。。。WPFに限らず、初心者です。
精進します。

kazuto様
お世話になっております。
アドバイスありがとうございました。

再読してみました。
これでは、ObservableCollection<T>のリストの中身は、書き換えられないということが、
Hongliang様の説明でわかりました。
ObservableCollection<T>は、setも不要だということもわかりました。

ありがとうございました!

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -