この質問は設計ヘルプに関連しています。その中で、私は問題と、私が考えたいくつかの解決策を、解決策についての私の意見とともに提示します。そして最後に、私が正しいと思う解決策です。私は自分のソリューションに対する検証または課題を求めています。長い投稿で申し訳ありません。
私はConfigActivityGroup
クラス(モデル)を持っています。アクティビティのグループを表します。ユーザーはActivityGroups
、グループの名前と文字列である複数のアクティビティを含む多数の を持つことができます。
ConfigActivityGroupVM
CRUDのコマンドを提供するConfigActivityGroups
は、のConfigActivityGroupVM
ObservableList<ConfigActivityGroup> を保持しConfigActivityGroups
ます。また、ObservableList<ConfigActivityGroup> の をConfigActivityGroupVM
保持し、UI がアクセスする を提示します。CollectionViewSource
ICollectionView
UI はまだ作成していませんがICollectionViewSource
、ユーザーがアイテムをクリックできるリストにバインドする予定です。GroupName のテキスト ボックスと、最初のリストActivities
にActivityGroup
隣接する の別のリストが表示されます。
ConfigActivityGroup
によって提供される電流の概念があるので、これで問題ありませんICollectionView
。current を使用ConfigActivityGroup
して 2 番目の UI リストにバインドし、current で を表示Activities
できますConfigActivityGroup
。
問題:CRUD
現在の のアクティビティ に対してコマンドを作成したい場合ConfigActivityGroup
。
が中にあり、Activities
それらをUIに直接バインドする場合、UIにバインドできる「現在の」アクティビティの概念がないため、VMのコマンドで現在のアクティビティを削除できます現在のコマンド用。ConfigActivityGroup
List<string>
DeleteCurrentActivityCommand
私が持っていた最初の解決策は、VM で (ICollectionView を介して) を選択したときに、選択したアクティビティを VM の新しいConfigActivityGroup
ものにコピーすることでした(これには独自のとがあります)。次に、UI の 2 番目のリストを現在のアクティビティの ICollectionView にバインドすることができます。そのため、私のコマンドはアクティビティの ICollectionView を変更します。ただし、アクティビティを別のアクティビティ文字列に設定できない現在の新しいアクティビティを作成しようとすると、障害が発生しました(読み取り専用であるため)。ConfigActivityGroup
ObservableCollection<string>
ViewSource
ICollectionView
ConfigActivityGroup
ConfigActivityGroup
ICollectionView.CurrentItem
ActivityString
その解決策の 1 つは、クラス内のアクティビティ文字列を 1 つの文字列にまとめることだと思いました。全体として、私はこの方法にあまり満足していませんでした。
私が考えた2番目の解決策List<string>
は、 in を にConfigActivityGroup
することでしたObservableCollection<string>
。これにより、VM が簡素化されます。モデルは非UIスレッドからマジック(MyCouch + CouchDB)を介してデータベースからロードされ、作成スレッドとは異なるスレッドからアクセスされるjson-deserialisation
と(メモリからだと思います)問題が発生するため、このアプローチの使用をためらっていますObservableCollection
. 多くのスレッドセーフな ObservableCollections の 1 つを使用するのはやり過ぎだと思いました。
この質問を書いているときに考えた3 番目の解決策List<string>
は、アクティビティのモデルを に保持することでしたConfigActivityGroup
。次に、ConfigActivityGroup
がその で選択されると、アクティビティの をソースとして直接ICollectionView
初期化します。そうすれば、UI はアクティビティに直接バインドでき、UI は実際のアクティビティ文字列の編集を処理できます。現在選択されているアクティビティの概念は残りますが、コマンドを使用して削除できます。CollectionViewSource/ICollection
List<string>
私は 3 番目のアプローチが正しいアプローチだと思いますが、コミュニティの意見を聞くことにオープンです。これは MVVM の私の最初の使用であり、責任を分離し、可能な限りコマンドを使用しようとしています。
追加データ:
- ConfigActivityGroup がデータベースからロードされて VM に配置されると、UI を介して VM 自体以外のユーザーによって変更されることはありません。