問題タブ [inotifycollectionchanged]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wpf - CollectionChanged イベントをリッスンしてメソッドを実行する方法
私のビューモデルには 2 つのコレクションがあり、1 つはMainCollection
で、もう 1 つは ですDerivedCollection
。それらはコントロールを使用して表示されるため、ユーザーがマウスを操作すると、項目を に追加または削除でき、MainCollection
それDerivedCollection
に応じて更新する必要があります。
最初の部分 ( update ) はデータ バインディングによって自動的に行われますが、メソッドをイベントMainCollection
にフックする方法がわかりません。RefreshDerivedCollection
MainCollection.PropertyChanged
コレクションとメソッドの両方が同じビューモデルに存在します。
c# - CollectionChanged とアイテムの IList - なぜ難しいのか
IList のパラメーターを使用して CollectionChanged を呼び出すと、NotSuportedExceptionObservableCollection/ListCollectionView/CollectionView
が発生する理由について調べています。
このトピックについて話しているいくつかのWebページを見つけました.UIをReset
完全に再描画する機能を使用するか、単に各アイテムを呼び出すCollectionChanged
か、より創造的な方法を提案しています: http://geekswithblogs.net/NewThingsILearned/ archive/2008/01/16/listcollectionviewcollectionview-doesnt-support-notifycollectionchanged-with-multiple-items.aspx
なぜ見つけられないのですか?私にとって、なぜこれが当てはまるのか意味がありません。
複数のアイテムをすばやく追加したい場合、 Add メソッドは多くのオーバーヘッドを必要とするため、開発サイクルのある時点で私たち全員が直面するこの不足している機能がいつでも実装される可能性はありますか (.Net 5 、C# 6...)。
編集:
私の特定のケースでは、私は自分のクラスを書きました:
それでも、前述のNotSupportedExceptionをスローします。
c# - DataGridView と INotifyCollectionChanged
カスタム コレクションに INotifyCollectionChanged を実装すると、DataGridView が CollectionChanged イベントをサブスクライブすることを念頭に置いていました。
My Collection は IListSource と INotifyCollectionChanged を実装し、内部 BindingList を持っています。BindingList から ListChanged イベントをサブスクライブし、OnCollectionChanged メソッドを呼び出して CollectionChanged イベントを発生させます。
おそらく、上記を達成するためのより良い方法があり、それを聞いてうれしいです. ただし、現時点での私の主な関心事は、この並べ替えメソッドが呼び出された後に DataGridView を更新することです。
DataGridView が CollectionChanged イベントをサブスクライブするという私の信念は間違っていますか、それとも何か間違ったことをしていますか?
c# - ListBox の ItemsSource としてのカスタム IEnumerable
カスタム GetEnumerator() 関数を定義するクラスがあります (IEnumerable<> を実装することにより)。私はそれを使用してObservableCollection<LogEvent>
、すべての TestStep にある複数の連続した方法で繰り返します。ObservableCollection<TestStep>
必要なすべてのデータを含むプライベートがあります。
このクラスのインスタンスを ListBox の ItemsSource として使用したいと考えています。ObservableCollection<LogEvent>
ただし、基になる data( ) が更新されても、ListBox は更新されません。そのクラスのサンプルを次に示します。
ここで INotifyCollectionChanged を実装する必要があるかどうか、または実装できるかどうかはわかりません。ObservableCollection が変更されたかどうかを知るにはどうすればよいですか?
私の質問は次のとおりです: ListBox に LogEvents (タイプObservableCollection<LogEvent>
) で発生した変更を表示するにはどうすればよいですか?
c# - C# 辞書変更通知 (INotifyCollectionChanged)
ライブ株価を取得するループを実行しています。私がやりたいことは、取得した価格のいずれかが既に辞書に保存されている価格と異なるかどうかを確認し、変更されたすべての価格の詳細を通知することです。INotifyCollectionChanged を利用して Dictionary の行に沿って探していました。
例えば
Add/Update をテストとして呼び出すメイン プログラムを使用します。ただし、NotifyCollectionChangedEventArgs をループするときは、ループをネストして IEnumerable にキャストする必要があります。これは非常に長く曲がりくねった方法のようです。
私の質問は 2 つあると思います:- A: これは、通知可能な辞書を使用する最良の方法ですか? B: 更新された値を取得するには、上記のようにネストされたループを使用する必要がありますか?
前もって感謝します
c# - データバインディングに関して INotifyCollectionChanged のポイントは何ですか (C# WinRt)
背景: IEnumerable、INotifyPropertyChanged、および INotifyCollectionChanged を実装して、独自の監視可能なコレクションを作成しようとしていました。正常に動作しますが、CollectionChanged イベントをデータバインドすると常に null になります。ただし、Items[] プロパティ変更イベントを送信しているため、databound プロパティは更新されます。したがって、私のクラスでは決してトリガーされないため、データバインディングに関して INotifyCollectionChanged のポイントは何なのか疑問に思いましたが、データバインディングは引き続き機能します (コレクションへのすべてのバインディングを更新します)。
次に、さらに掘り下げて、ObservableCollection を逆コンパイルすることにしました。ObservableCollection にデータバインドすると、実装のように CollectionChanged イベントは null ではありません。
ですから、ObservableCollection が「特別な」扱いを受ける理由と、INotifyCollectionChange がデータ バインディングで果たす役割 (ある場合) について本当に疑問に思っています。
wpf - CollectionChanged での WPF DataGrid の更新が失敗する
DataGrid を TEntity 型の ObservableCollection にバインドしました。コレクションは、Entity Framework エンティティを保持します。
このようなエンティティが DB で変更されると、アプリに通知されます。単純な置換変更の場合は、ObservableCollection 内のエンティティを上書きするだけです。
ただし、UI の更新はトリガーされません。問題は、私が参照しているオブジェクトがまだ同じであることだと思います。一部の列が変更されたため、エンティティはUIに表示されるものとは明らかに異なります(DbContextでリロードします)。
私がこれをするとき
何も起こりません。コレクションは CollectionChanged イベントを正しく発生させますが、UI は何も更新しません。
それから私はこれを試しました:
これで UI が更新されますが、コレクションはもちろん 2 つの CollectionChanged イベントを発生させます。
1 つのオプションは、変更されたエンティティのすべてのプロパティに対して PropertyChanged イベントを発生させることだと思いますが、それはやり過ぎ (イベントが多すぎる) と思われ、これまでのところ、EF クラスにイベントを実装する必要はありません。
私の質問:行が変更されたがオブジェクトがまだ同じである場合 (オブジェクト内のプロパティは変更されています)、WPF バインドされた ObservableCollection を確実に更新するにはどうすればよいですか?
c# - C#割り当ての適切なパターン、オブジェクトのプロパティはコレクションです
やなど、さまざまなタイプのコレクションをプロパティとして公開するクラスがList<Address>
ありSortedSet<string>
ます。コレクション クラスは read-onlyperson.Address[3].City = "MyTown"
であるべきであり、 やなどの更新用のコレクションを公開してはならないことを理解していperson.EmailAddresses.Add("foo@bar.tld")
ます。これをサポートする C# パターンを探しています。
私のクラス (この例では Person など) が を実装しているため、私の要件は少し独特ですINotifyPropertyChanged
。したがって、これらのコレクションに変更が加えられた場合は、コンテナー オブジェクト (人物) でイベントを発生させて、クライアント アプリケーションに通知したいと考えています。ObservableCollection<T>を使用できることはわかっています。そのために、ソートされたストレージを維持する派生クラスのthisおよびthisSortedSet
のような例があります。この Person クラスを利用する他の開発者のために、自分のプロジェクトにカスタム クラスを追加しないようにしています。クライアント アプリケーションが他の構造を操作する必要性を減らすために、CLR クラスのみを公開したいと考えていますが、それは必須ではありません。 .
このソートされたストレージの問題に対するほとんどの解決策は、「ソートされたデータを保存せず、クライアントのビューに任せる」ことですが、このクラスを使用している開発者はソートの共通機能を残しており、それぞれが独自の実装を作成するために個別の時間を費やしています。別のテクノロジ (WPF コンポーネント、LINQ など) で。この例では、Person
クラスは別のよりプリミティブなクラスをラップします。たとえば、私のプロパティには配列SortedSet<string> Email
を作成するセッターがあります。EMAIL[]
その配列をシリアル化すると、従来の目的で並べ替える必要があり、基本型が並べ替えられている場所で、並べ替えられたジェネリック コレクションを公開したいと考えています。
また、コレクションの内容が変更されたときに PropertyChanged イベントを発生させるべきではないことも読みました。この場合、クライアント アプリケーションは、このオブジェクトになんらかの変更が加えられるたびに知る必要があり、それを行うべきではない理由についての議論は、実際にそれが必要であるという現実と一致しません。
要約すると、コンテナー オブジェクト内にカプセル化されたコレクションを変更するための一貫した C# デザイン パターンを探しています。コレクションが並べ替えられる場所、コレクション要素が値型または参照型である可能性がある場所、およびクライアント アプリケーションがこのオブジェクトを使用する場所です。すべての変更の変更通知を受け取る必要があります。
この時点で、すべてのコレクション型に対してこのクラスの一貫した API を作成し、Person
コレクション オブジェクト全体をおそらくジェネリック CLR コレクションとしてではなく、厳密に型指定されたクラスとして取得し、インスタンス プロパティをそのようなオブジェクト、要素を設定し、それをクリアします。しかし、私はむしろ、一般的なゲッター/セッターを使用してこれらすべてを実行したいと考えています。
c# - (本当に)ObservableCollectionUIを更新しない
Emblem
に表示するタイプのオブジェクトのリストがありますLongListMultiSelector
。まだ達成されていないものだけを示したいと思います。1 つまたは複数の項目を選択して変更できますIsAchieved = true
が、問題はそれらがすぐに消えず、UI が自動的に更新されないことです。
を使っていたので問題ないと思いましたObservableCollection<T>
。その後、アイテムのプロパティが変更された場合、コレクションに通知されないことがわかりました。その結果、INotifyPropertyChanged
インターフェースを実装しましたが、これも機能しません。
ここSOで、この問題を共有する次の質問(およびその他)を見つけました:
- Item が変更されたときに ObservableCollection に通知する
- ObservableCollection がその中の項目が変更されたときに気付かない (INotifyPropertyChanged を使用しても)
- ObservableCollection 内のアイテムが変更されたかどうかを検出する方法
の使用法も実装しようとしましたTrulyObservableCollection<T>
が、結果もありませんでした。これが私が持っているものです
XAML コントロール:
アイテムは次の方法でバインドされますEmblemsViewModel
。
クラスは次のEmblem
とおりです。
これが機能しない原因は何ですか?
アップデート:
CollectionViewSource
フィルタリングを適用するために を適用しましたが、アイテムが表示されません。
XAML: