問題タブ [ieditableobject]

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.

0 投票する
1 に答える
750 参照

mvvm - Silverlight MVVM IEditableObject ダイアログ

John Papa によるBookShelfデモ アプリケーションをいじっています。また、書籍アイテムの編集方法を調整したいと考えています。そのアプリケーションでは、BookView と EditBookWindow の両方が同じ ViewModel BookViewModel にバインドされていますが、これは問題ありません。

ブックを選択すると、EditBookWindow が子ウィンドウで開かれます。

いずれかの値を編集すると、選択した本のデータが BookViewModel で更新されます。ここで問題が発生します。ダイアログ ウィンドウで [キャンセル] を押しても、変更は保持されます。

私がやりたいことは、ダイアログウィンドウを開いて編集を開始する前に、エンティティをその状態に「ロールバック」するように変更することです。

この問題に関する私の Google 検索では、これを解決する最も効率的な (そして簡単な) 方法は、IEditableObject インターフェイス (BeginEdit、EndEdit、または CancelEdit) を使用することだと思います。

このインターフェイスを実装する方法がわかりません。EditBookWindow と BookView の両方が同じ ViewModel を共有しているため、変更された項目はプロパティ SelectedBook に格納されます。

  1. IEditableObject は私の問題に対する最も簡単なアプローチですか?
  2. Can anyone give some pointers on where (ViewModel, Views) and how I could implement the interface?
0 投票する
1 に答える
571 参照

silverlight - Silverlight DataForm、MVVM、IEditable オブジェクト、およびカスタム EditTemplate。カスタム ダーティ ステート チェックの方法

Silverlight DataForm と子コレクションに関して興味深い問題があります。機能するソリューションもありますが、ハックのように感じます (ハックです)。誰かがよりエレガントなソリューションを持っているかどうか疑問に思っていました。

GroupViewModels のコレクションにバインドされた DataForm があります。各 GroupViewModel には UserViewModels の ObservableCollection があり、DataForm の EditTemplate が表示されているときにユーザーが追加および削除できるようにしたいと考えています。

これを行うための UI は、すべてのユーザーのリストを含む単純な ComboBox と、現在グループ内のユーザーの ListBox です。ユーザーをあるリストから別のリストに移動するための追加ボタンと削除ボタンがあります。

さて、... DataForm がバインドされているビュー モデルは IEditableObject を実装しています..編集がキャンセルされた場合にロールバック動作が発生するため、これはクールですが、この場合は十分ではありません。VM がダーティな状態かどうかを明示的に DataForm に伝える方法が必要です。

私のViewModelには、すべてのユーザーのComboBoxのSelectedItemがバインドされているSelectedUserToAddプロパティがあるため、ユーザーが追加するユーザーを選択すると、VMでPropertyChangedイベントが発生し、DataFormは何かが変更されたと考え、コミット(OK)ボタンが点灯します。また、SelectedUserToRemove プロパティにより、ListBox で選択が変更されたときにも点灯します。

明らかに、ListBox の UserViewModels が変更された場合にコミット ボタンが点灯するようにしたいのです。

解決策は簡単です。SelectedUserToAdd および SelectedUserToRemove プロパティから変更通知を削除すると、コミット ボタンの点灯を停止できます。また、AddUser または DeleteUser コマンドが取得されたときに NotifyPropertyChanged を発生させる「Dirty」というダミー プロパティを使用して、コミット ボタンを再び点灯させることができます。解雇した。

私が言うように、それは機能しますが、気分が悪いです。誰かがより良いアイデアを得ましたか?

よろしくお願いします。

0 投票する
1 に答える
3043 参照

wpf - DataGrid での IEditableObject の使用法は何ですか?

http://blogs.msdn.com/b/vinsibal/archive/2009/04/07/5-random-gotchas-with-the-wpf-datagrid.aspxからの抜粋は次のとおりです。

5. データ ソース アイテムは、IEditableObject を実装してトランザクション編集機能を取得する必要があります。

IEditableObject に慣れていない場合は、適切な説明とコード サンプルが記載されているこの MSDN の記事を参照してください。DataGrid には、IEditableObject インターフェイスを介したトランザクション編集の機能が組み込まれています。セルの編集を開始すると、DataGrid はセル編集モードと行編集モードになります。これが意味することは、行をキャンセル/コミットするだけでなく、セルをキャンセル/コミットできるということです。たとえば、セル 0 を編集し、Tab キーを押して次のセルに移動します。タブを押すと、セル 0 がコミットされます。セル 1 に入力し始めて、操作をキャンセルしたいことに気付きました。「Esc」を押すと、セル 1 が元に戻ります。操作全体をキャンセルしたいので、もう一度「Esc」を押すと、セル 0 が元の値に戻ります。

IEditableObject を実装しなくても、これと同じトランザクション動作が得られます。私は何が欠けていますか?

0 投票する
0 に答える
977 参照

.net - WPF Datagrid:IEditableObjectの動作を回避するには?

ItemsSource としてエンティティのコレクションを持つ Wpf Datagrid があります。エンティティ タイプは、IEditableObject インターフェイス (BeginEdit、CancelEdit、EndEdit) を実装します。

グリッドの行を選択するときに「BeginEdit」を明示的に呼び出し、確認せずに行を離れるときに「CancelEdit」を呼び出す動作を管理するため、データグリッドが IEditableObject インターフェイスのメソッドを自動的に呼び出すのを防ぎたいです。

代わりに、セルを選択するたびにデータグリッドが自動的に「BeginEdit」を呼び出し、それを回避しました。

このデフォルトの動作を無効にすることは可能ですか?

0 投票する
2 に答える
311 参照

wpf - Linq.Enumerable.Where が ObservableCollection を壊すのはなぜですか

バックグラウンド:

MVVMパターンに厳密に従って、WPFアプリケーションを作成しています。さまざまなデータベースに接続するための汎用インターフェイスとして BaseRepository クラスがあり (EF はオプションではありません)、すべて正常に動作します。これは単なる技術的な質問です。

NotifyingCollection というラップされた ObservableCollection を使用して、IEditableObject の ItemEndEdit イベントをサブスクライブします (私の ViewModelBase エンティティ ラッパーは INotifyPropertyChanged および IEditableObject メンバーを実装しています)。

提供されているコード サンプルは、WPF DataGrid 内のアイテムの編集時に ReadAll メソッドが呼び出されると、" 'EditItem' はこのビューには許可されていません" という例外をスローします。ただし、メソッド内の行をコメントアウトされた部分に置き換えると、完全に機能します!

質問:

つまり、コレクションの IEnumerable バージョンを返す代わりに、Linq.Enumerable.Where 拡張メソッドを中継すると、カスタム コレクションから機能が削除されるように見えます。それらが両方とも IEnumerable である場合、なぜそれが起こるのでしょうか?

コードサンプル: