問題タブ [inotifypropertychanged]
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 - ObservableCollection に INotifyPropertyChanged を実装した目的は何ですか?
ObservableCollection
INotifyCollectionChanged
と の両方を実装しINotifyPropertyChanged
ます。
アイテムの追加、削除 (+ クリア)、および置換は、コレクションのイベント を通じて消費者に通知可能であり、既存のアイテムの更新は、アイテムがそれ自体を実装する場合、アイテムのイベント
CollectionChanged
を使用して監視できることを理解しています。PropertyChanged
INotifyPropertyChanged
読み取り専用であるため、コレクションのイベントに登録できないことを他の人から読みました
PropertyChanged
。
では、その目的は何なのか、私たちはそれをどのように利用できるのでしょうか?
あちこちのコメントは、コレクションとアイテムの両方のコンテンツの変更を通知できるように、両方のインターフェイスを実装することが魔法のようであることを暗示して、議論を混乱させているようですがObservableCollection
、これは正しくありません (これは、コレクションがアイテムのコンテンツが変更された後に魔法のように更新されるリストボックスにバインドされており、コレクションがリストボックスに通知することを示唆しています)。
実際、コレクションの唯一の利点は実装することINotifyCollectionChanged
です。アイテム プロパティの変更を処理するObservableCollection
のは、別のコレクションよりも簡単ではないようです。アイテムが を実装している場合にのみ可能ですが、実装INotifyPropertyChanged
していない可能性があり、ユーザーがコレクションとは無関係にこのイベントをフックできた場合にのみ可能です。
これは正しいです?
c# - 複数のプロパティに影響する PropertyChanged
次のように、値が互いに依存する変数がいくつかある状況があります。
A は B と C の関数 B は A と C の関数 C は A と B の関数
どちらの値も UI で変更できます。私は次のように計算と変更通知を行っています:
変更された変数のセッターで計算メソッドを呼び出し、_valB、_valC (たとえば) の値を計算してから、これらの値に対して PropertyChanged を呼び出しています。変数間の依存関係のために、私はこのようにしています。このように、どの変数が正しい値で計算されるかを制御できます。また、他の変数の PropertyChanged をトリガーし、変数のゲッターで計算を実行することも考えましたが、以前にどのプロパティが変更されたかを知り、その値を使用する必要があります...それが最善/最も簡単な解決策かどうかはわかりません。
これはこれを行う良い方法ですか?セッターブロックでこれを実行するという考えは好きではありませんが、現時点ではそれを行うためのより良い方法がわかりません。
もう 1 つの問題は、IdataErrorInfo を使用して検証/エラー情報を UI に表示することです。問題は、this[columnName] インデクサーがセッターの最後に呼び出され、計算の前に値を検証する必要があったため、値が入力は有効ではありません計算は行われません.IDataErrorInfoを放棄し、計算が行われる前に検証メソッドを呼び出すことを真剣に検討しています. それを明示的に呼び出す方法、または値の属性の直後に呼び出す方法はありますか?
注: ViewModel から別のオブジェクトで検証ロジックを呼び出す必要があるため、ValidationRules はオプションではありません。
wpf - DependencyProperties の代わりに INotifyPropertyChanged を使用したデータ バインディング
私はデータバインディングを WPF で動作させることに 1 週間強取り組んできました。ここで DataContext に関して貴重な助けを得て、DependencyProperties を介してデータバインディングを機能させました。INotifyPropertyChanged
データ バインディングについて学習しているときに、多くの点で DP よりも優れていることについて、多数の議論に出くわしました。私はそれを試してみることにしました。
Josh Smith の基本 ViewModel クラスを使用しており、ViewModel はそこから派生しています。ただし、データバインディングを機能させるのに少し問題があります。どこが間違っているのか、ここの誰かが教えてくれることを願っています。
私のViewModelクラスには、ObservableCollection<string>
. 私の GUI には、この OC にバインドされたコンボボックスがあります。
GUI の DataContext は ViewModel に設定されます。
ViewModel には「PluginNames」という名前の OC があります。
GUI がロードされると、OC をインスタンス化し、それにプラグイン名を追加するメソッドが呼び出されます。OC が変更された後、私は を呼び出しますRaisePropertyChanged( "PluginNames")
。WPF データバインディング モデルは INotifyPropertyChanged を認識しているため、これだけで「魔法のように動作」し、ロードされたプラグインでコンボボックス項目が更新されることを期待していましたが、そうではありません。
誰かが私がここで間違ったことを指摘できますか? ありがとう!
更新:理由はわかりませんが、明らかな更新を行わない代わりに、プロパティがまったく見つかりません。私は本当に愚かで、どこかで重要なステップを逃していると思います.
wpf - MVVM階層の変更通知
いくつかの抽象ViewModel基本クラスで、次のような単純な古いプロパティがあるとしましょう。
次に、次のプロパティを含む前のViewModelを継承して、より具体的なViewModelを作成します。
ここで、一部のViewクラスで、前述のViewModelのRectangle
プロパティにバインドします。サイズを変更するまで、すべて正常に動作します。Size
変更された場合、Rectangle
それについては知らず、変更はビューに伝播されません。また、Rectangle
は子クラスであるOnPropertyChanged("Rectangle")
ため、Size
セッターに単純にを追加することはできません。
ここで、のような多くの異なるプロパティがRectangle
あり、それらはすべて基本クラスのプロパティに依存しており、これらの変更はいずれも伝播されていないことを想像してください。変更通知を連鎖させるための軽量でエレガントな方法が必要です。できれば、多くのコードを必要とせず、依存関係のプロパティを使用する必要がない方法が必要です。
明らかに、ここには醜い解決策がたくさんあります-私が探しているのは、クリーンで賢いものです。これは非常に一般的なシナリオであるように思われ、MVVMに適した方法があるように思われます。
c# - WPF データバインディングの質問
私は次のことを達成しようとしている非常に短いアプリを作成しました:CheckBox
コードから状態を変更します。私はINotifyPropertyChanged
インターフェースを配線し、いくつかの結果が表示されることを期待していましたが、どうやらアプリは何もしません。データバインディングに何か問題がありますか?
Window1.cs
Window1.xaml
c# - WPFでいくつかのリンクされたデータバインドされたTextBox値を検証する
WPFで2つの関連するTextBox値を検証するための洗練された方法を見つけようとしています。
各テキストボックスのTextプロパティは、TwoWayバインディングのINotifyPropertyChangedを実装するクラスのパブリックdecimalプロパティにバインドされます。
BiggerValue> = SmallerValue>=0のように2つの値を検証したい
IDataErrorInfoと文字列インデクサーを使用して、これらの条件に対して個別に検証する各値を取得することに成功しました。
私の問題は次のとおりです。ユーザーは両方の値を減らすことを意図しており、BiggerValueで開始するため、現在はSmallerValueよりも小さくなっています。BiggerValue TextBoxの検証は失敗します(値は保存されますが)。次に、ユーザーはSmallerValueに移動し、新しいBiggerValueよりも小さく設定します。これで両方の値が再び有効になりますが、BiggerValueテキストボックスにその(変更されていない)値が有効になったことを自動的に反映させるにはどうすればよいですか?
テキストボックスでLostFocus()のようなイベントハンドラーを確認する必要がありますか、それともプロパティセッターにこのようなものを追加して強制的に更新する必要がありますか?
私の完全なコードは以下の通りです。どういうわけか、この単純な問題では、すべてがかなり不格好で複雑すぎるように感じます。WPFの初心者(これは2日目です)として、私のアプローチについてのコメントは、どんなに過激であっても、ありがたいことに受け取られます。
XAML:
C#:
c# - INotifyPropertyChangedを使用したNullable型とプロパティ
null許容型の値を設定し、iNotifyPropertyChangedを実装するのはやり過ぎのようです。これを行うためのより良い方法はありますか?
単純なコードを使用してみましたが、MyBase.RaisePropertyChanging( "WorkPhone")のブレークポイントがヒットせず、値が変更されません。
wpf - WPF: カスタマイズされた ListBox と List のバインド: PropertyChanged は常に null
XAML で宣言された ListBox をカスタマイズしました。
T が次のような一般的な List を表示して相互運用する必要があります。
QonfBase は非常に単純な基本クラスです。
プログラムで Activated プロパティを有効にすると、チェックボックスの状態が変わりません。デバッグ: PropertyChanged = null。誰が知っていますか、何が間違っていますか?
wpf - WPF:データバインディングで使用されるコレクションの適切な基本クラスは何ですか?
強く型付けされたコレクションクラス(例)を使用してオブジェクトモデルを構築していますCustomerCollection
。コレクション自体とコレクション内のすべてのデータモデルの両方で完全な双方向バインディングをサポートしたいと思います。
モデルの場合、実装INotifyPropertyChanged
はモデルを接続する正しい方法のようです。しかし、コレクションのコンテンツがいつ変更されたかをWPFが認識できるようにするには、どのインターフェイス/基本クラスを使用する必要がありますか?
c# - DataContracts で INotifyChanged を使用する
実際のサービス データをサービス機能から分離しようとしているため、複数のプロパティ (データ メンバー) を保持するデータ コントラクトとしてデータを返しています。クライアント コードは、プロキシ コードの INotifyPropertyChanged 実装も生成する svcutil /edb を使用して生成されます。私のテストで明らかになった限り、そのコードはサーバーで発生した変更に対して PropertyChanged イベントを呼び出しません。さらに、プロパティを取得すると、データ コントラクト プロキシが取得されたときと同様に、プロパティ値のみが返されます。
基本的に、ここに私が持っているものがあります:
(サーバ側)
(クライアント側)
データ コントラクト プロキシは、サーバーのデータ コントラクトに対する透過的なプロキシとして機能することを期待していますが、完全にバインドされていないようです。
よろしくお願いします。
ロムート