2

エンティティオブジェクトのコレクションビューにバインドされたリストビューがあります(メッセージと呼ばれます)

更新をバインドするリストビューアイテムは、メッセージオブジェクトコレクションが変更されたときにトリガーされます(dispatchertimer)。

これが発生すると、リストビューで現在選択されているアイテムの選択が解除されます。

リストビューアイテムコレクションでLINQ検索を実行して、特定のIDのメッセージオブジェクトを見つけて再選択するにはどうすればよいですか?

int id = ((Message)lvMessages.SelectedItem).Id;

lvMessages.DataContext = service.Messages;
ICollectionView view = CollectionViewSource.GetDefaultView(lvMessages.ItemsSource);
view.Filter = new Predicate<object>(FilterMessageItem);

//var li = lvMessages.Items.Cast<Message>().Where(m => m.Id == id).SingleOrDefault();

lvMessages.SelectedItem = li;

コメント行でこのエラーが発生するため、Linqクエリを設定する方法がよくわかりません...

タイプSystem.Collections.Generic.IEnumerable'を'BusinessObjects.Message'に暗黙的に変換することはできません。明示的な変換が存在します(キャストがありませんか?)

たぶん、コレクション内の変更されたアイテムをリストビューに入力するためのより良い方法がありますか?わからない。

4

1 に答える 1

0

簡単な答えは「あなたはしない」です。

ListviewをViewModelのコレクションにバインドした場合は、選択したアイテム(aまたはPOCO with )ItemSourceのプロパティをViewModelに作成し、Listviewの属性をそのプロパティにバインドします。DependencyPropertyINotifyPropertyChangedSelectedItem

リストビューでアイテムを選択すると、このプロパティ値が更新され、プロパティを使用してViewModelの値を変更すると、リストビューの選択が更新されます。MVVMとバインディングを使用すると、ViewModelから、またはコードビハインドを含む他の場所からビューコントロールなどにアクセスする必要はありません。

于 2012-11-22T03:14:17.527 に答える