リスト/アイテムのコレクションをListBoxにバインドするWPFですが、アイテムが更新された後、UIが更新されません。解決しました。
私はただ愚かです。ObservableCollection<>
の代わりに使用することについて多くのことを読みましたがList<>
、私はこの提案を無視し続け、他の提案に従いましたが、役に立ちませんでした。私の本に戻って読み直してください。コレクション内のアイテムが変更されたときに表示を更新するために必要なインターフェイスが提供されていないため、これはObservableCollection<>
使用する必要があることはかなりよく説明されています。List<>
INotifyCollectionChange
ListBox
これは更新されたコードです:
private ObservableCollection<StringWrapper> m_AppLog;
ObservableCollection<StringWrapper> Log { get { return m_AppLog; } }
非常にシンプルで、他に何も必要ありません(Refresh()など)。ObservableCollectionは変更イベントのトリガーを自動的に処理するため、不要な呼び出しを削除することができました。
// notify bound objects
OnPropertyChanged("Log");
ObservableCollection
作成しなかったスレッドによる更新はサポートしていません。私のリスト(最近のエラー/情報メッセージを表示するビジュアルログ)はさまざまなスレッドから更新できるため、この方法でコードを調整して、リスト自体のディスパッチャーで更新が行われるようにします。
public void AddToLog(string message) {
if (Thread.CurrentThread != Dispatcher.Thread) {
// Need for invoke if called from a different thread
Dispatcher.Invoke(
DispatcherPriority.Normal, (ThreadStart)delegate() { AddToLog(message); });
}
else {
// add this line at the top of the log
m_AppLog.Insert(0, new StringWrapper(message));
// ...
また、に反してObservableCollection<>
サポートされていないことに注意してください。これは、ListからObservableCollectionに切り替えるときに必要となる可能性のある調整の一部です。RemoveRange()
List<>