問題タブ [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.
silverlight - 計算されたプロパティの PropertyChanged 通知
Silverlight2 でアプリケーションを開発しており、Model-View-ViewModel パターンに従おうとしています。一部のコントロールの IsEnabled プロパティを ViewModel のブール型プロパティにバインドしています。
これらのプロパティが他のプロパティから派生している場合、問題が発生しています。保存が可能な場合にのみ有効にしたい [保存] ボタンがあるとします (データが読み込まれ、現在データベースで作業を行っているわけではありません)。
したがって、次のようなプロパティがいくつかあります。
今私がやりたいことはこれです:
ただし、プロパティ変更通知がないことに注意してください。
問題は次のとおりです。バインドできる単一のブール値プロパティを公開するクリーンな方法は何ですか?ただし、明示的に設定する代わりに計算され、UI が正しく更新されるように通知を提供します。
編集: みんなの助けに感謝します-私はそれを始めて、カスタム属性を作成してみました. 誰かが興味を持っている場合に備えて、ここにソースを投稿します。よりクリーンな方法で実行できると確信しているので、欠陥が見つかった場合は、コメントまたは回答を追加してください。
基本的に私がしたことは、どのプロパティが他のプロパティに依存するかを保持するキーと値のペアのリストを定義するインターフェイスを作成することでした:
次に、各プロパティに属性を追加しました。
属性自体には、1 つの文字列のみが格納されます。プロパティごとに複数の依存関係を定義できます。属性の根幹は BuildDependentPropertyList 静的関数にあります。クラスのコンストラクターでこれを呼び出す必要があります。(クラス/コンストラクター属性を介してこれを行う方法があるかどうか知っている人はいますか?)私の場合、これはすべて基本クラスに隠されているため、サブクラスではプロパティに属性を配置するだけです。次に、OnPropertyChanged に相当するものを変更して、依存関係を探します。例として、私の ViewModel 基本クラスを次に示します。
最後に、影響を受けるプロパティの属性を設定します。私がこの方法を気に入っているのは、派生プロパティが依存するプロパティを保持しているからです。逆ではありません。
ここでの大きな注意点は、他のプロパティが現在のクラスのメンバーである場合にのみ機能することです。上記の例では、 this.Session.IsLocked が変更された場合、通知は届きません。これを回避する方法は、this.Session.NotifyPropertyChanged にサブスクライブし、「Session」の PropertyChanged を起動することです。(はい、これにより、必要のない場所でイベントが発生します)
.net - DataGridView で選択した複数の INofityPropertyChange オブジェクトを更新する
ユーザーコントロールに配置されたマルチセレクトが有効になっているDataGridView
(Windowsフォーム)を使用しています。次のコードを実装するパブリック メソッドを呼び出して、ユーザー コントロールの外部から選択したすべての行を更新したいと思います。
残念ながら、複数の行が選択された場合、DataGridViewRow
すぐに更新されるのは 1 つ、つまり最後に選択された行だけです。基礎となるオブジェクトが変更され、NotifyPropertyChange イベントが発生します。さらに、更新後に選択を変更すると、すべての行がすぐに更新されたように正確に更新されます。
2 つ目は、非常に奇妙です: Rating
NotifyPropertyChange が発生する -property の Setter にブレークポイントを設定し、コードの実行を続行する前に数秒待機すると、すべてが正常に機能します (すべての行がすぐに更新されます)。待たずに、ブレークポイントを通過するたびに F5 キーをすばやく押すと、上記の効果が得られます。
私のビジネスオブジェクトは次のようになります(もちろん大幅に短縮されています):
誰かがすでにこの動作に気付いているか、解決策 (または回避策) を知っていますか?
linq - DataContext Refresh および PropertyChanging & PropertyChanged イベント
外部ソースから、特定のエンティティが現在のデータコンテキスト外で変更されたという通知を受けている状況にあります。エンティティを見つけて、そのように更新を呼び出すことができます
MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues, myEntity);
エンティティで変更されたプロパティが正しく更新されます。ただし、更新が発生したときに INotifyPropertyChanging INotifyPropertyChanged のどちらも発生していないように見えるため、UI に誤った情報が表示されたままになります。
Refresh() がエンティティで正しいプロパティ ゲッターとセッターを使用して変更通知イベントを発生させられないことは承知していますが、同じことを達成する別の方法があるのではないでしょうか?
私は何か間違ったことをしていますか?リフレッシュよりも良い方法はありますか? 更新が唯一のオプションである場合、誰かが回避策を持っていますか?
c# - [Serializable] INotifyPropertyChanged実装者から非シリアル化オブザーバーを除外する方法は?
私はそのようなエンティティクラスをほぼ100個持っています:
[field:NonSerialized]
の属性に注意してくださいPropertyChanged
。一部のオブザーバー (私の場合、編集用のエンティティを表示するグリッド) はシリアル化できない場合があり、別のマシンで実行されているアプリケーションによってリモート処理によって提供されるため、エンティティはシリアル化可能である必要があるため、これが必要です。 .
このソリューションは、些細なケースでは問題なく機能します。ただし、一部のオブザーバーが である可能[Serializable]
性があり、保存する必要があります。これをどのように処理すればよいですか?
私が検討している解決策:
- full
ISerializable
- カスタム シリアライゼーションには多くのコードを記述する必要があります。これは避けたいと思います [OnSerializing]
および[OnDeserializing]
属性を使用してPropertyChanged
手動でシリアル化しますが、これらのヘルパー メソッドは のみを提供しSerializationContext
、AFAIK はシリアル化データを保存しません (SerializationInfo
そうします)
c# - INotifyPropertyChanged でリストボックス項目を更新する方法
オブジェクトのコレクションにデータバインドされたリストボックスがあります。これらのオブジェクトのどれがプログラムの START オブジェクトであるかをユーザーに示すために、項目の表示方法を変更したいと考えています。
これを次の方法で実行しようとしましたが、リストボックスが自動的に更新されません。コントロールの無効化も機能しませんでした。
私が見つけることができる唯一の方法は、データバインディングを完全に削除して再度追加することです。しかし、私の場合、それは望ましくありません。
別の方法はありますか?
リストとスタートとなるアイテムを管理するクラスです
フォームでは、次のコードを使用します
c# - 少なくとも 2 文字が変更された場合にのみ INotifyPropertyChanged が発生するのはなぜですか?
ようやく、Silverlight MVVM の例が動作するようになりました。これにより、名と姓のテキスト ボックスの値を変更すると、氏名が自動的に変更されます。
ただし、奇妙なことに、 INotifyPropertyChanged から継承する私のモデルは、姓または名の少なくとも 2 文字を変更した場合にのみ通知されます。
- 「Smith」を「Smith1」に変更すると、イベントは発生しません
- 「Smith」を「Smith12」に変更すると、期待どおりにイベントが発生します
Silverlight/XAML/INotifyPropertyChanged でこれに遭遇した人はいますか? どうなり得るか?「変更済み」として通知される前に、テキストボックスをどれだけ変更する必要があるかを示す設定がどこかにありますか?
私が使用しているコードの主要部分は次のとおりです。
Customer.cs:
CustomerHeaderView.xaml:
CustomerViewModel.cs:
MainPage.xaml.cs:
アップデート:
このプロジェクトを WPF で作り直したところ、問題なく動作しました。おそらくSilverlight 3の問題です。
c# - MVVMでは、ViewModelまたはModelはINotifyPropertyChangedを実装する必要がありますか?
私が試したほとんどのMVVMの例では、Modelが実装され ていますINotifyPropertyChanged
が、Josh SmithのCommandSinkの例 では、ViewModelが実装されてINotifyPropertyChanged
います。
私はまだMVVMの概念を認知的にまとめているので、次のことを理解していません。
- 作業を開始
INotifyPropertyChanged
するには、ViewModelにを配置する必要がありますCommandSink
- これは単なる規範の逸脱であり、実際には問題ではありません
- 常にモデルを実装する必要があります。
INotifyPropertyChanged
これは単なる間違いであり、コード例からアプリケーションに開発された場合に修正されます。
あなたが取り組んできたMVVMプロジェクトで他の人はどのような経験をしましたか?
c# - INotifyPropertyChangedがXAMLの変数を更新しないのはなぜですか?
モデル内で変化するデータをシミュレートし、そのデータをXAMLに反映させたいと思います。私が理解しているように、INotifyPropertyChangedを実装する必要があります。
ただし、次のコード例では、XAMLは顧客からのデータを1回だけ表示しますが、日付と時刻は変更されません。
XAMLがモデル内で変更されたときに現在の日付と時刻を継続的に表示するようにするには、次の例で何を変更する必要がありますか?
特に、Bindingがモデルを毎秒チェックするタイミングをどのように知るのかわかりませんか?1秒間に10回?応答しているイベントはありません。ここで何が欠けていますか?
XAML:
コードビハインド:
wpf - i リストを含むプロパティの INotifyPropertyChanged
こんにちは、myClass でこのコードを使用して、wpf アプリケーションのコンテンツを変更しています
myClass のプロパティを変更するたびに、アプリにあるラベルが変更されます。
これは問題なく動作しますが、myClass には別のクラスへの ilist を含むプロパティがあります
ここで私の質問に、Notify メソッドは Ilist のコンテンツを更新しません。ilist とビューで更新する方法があります。myclass のすべてのプロパティは、文字列または int の場合は正常に機能しますが、Ilist の場合は更新されません。私の英語が悪いという意味を理解してくれることを願っています..助けてくれてありがとう
ここにxamlのコード
{Binding Path=Articles} <-- これは ilist を含むプロパティです <-- これは Article クラスのプロパティです
wpf - wpf のリストを自動更新する
ListBox で作成した一連のオブジェクトを表示したいと考えています。私のオブジェクトは INotifyPropertyChanged インターフェイスを実装しています。リストボックス コントロール (listbox1.DataContext = MyCollection) にバインドした ObservableCollection を使用しようとしましたが、オブジェクトの 1 つのプロパティの 1 つがMyCollection が変更されます。このブログ投稿を見つけました: http://sweux.com/blogs/psampaio/index.php/2009/04/13/creating-a-custom-observable-collection-in-wpf
これは本当に複数のオブジェクトを追跡する最も簡単な/唯一の方法ですか?