2

この質問は設計ヘルプに関連しています。その中で、私は問題と、私が考えたいくつかの解決策を、解決策についての私の意見とともに提示します。そして最後に、私が正しいと思う解決策です。私は自分のソリューションに対する検証または課題を求めています。長い投稿で申し訳ありません。

私はConfigActivityGroupクラス(モデル)を持っています。アクティビティのグループを表します。ユーザーはActivityGroups、グループの名前と文字列である複数のアクティビティを含む多数の を持つことができます。

ConfigActivityGroupVMCRUDのコマンドを提供するConfigActivityGroups

は、のConfigActivityGroupVMObservableList<ConfigActivityGroup> を保持しConfigActivityGroupsます。また、ObservableList<ConfigActivityGroup> の をConfigActivityGroupVM保持し、UI がアクセスする を提示します。CollectionViewSourceICollectionView

UI はまだ作成していませんがICollectionViewSource、ユーザーがアイテムをクリックできるリストにバインドする予定です。GroupName のテキスト ボックスと、最初のリストActivitiesActivityGroup隣接する の別のリストが表示されます。

ConfigActivityGroupによって提供される電流の概念があるので、これで問題ありませんICollectionView。current を使用ConfigActivityGroupして 2 番目の UI リストにバインドし、current で を表示ActivitiesできますConfigActivityGroup

問題:CRUD現在の のアクティビティ に対してコマンドを作成したい場合ConfigActivityGroup

が中にあり、ActivitiesそれらをUIに直接バインドする場合、UIにバインドできる「現在の」アクティビティの概念がないため、VMのコマンドで現在のアクティビティを削除できます現在のコマンド用。ConfigActivityGroupList<string>DeleteCurrentActivityCommand

私が持っていた最初の解決策は、VM で (ICollectionView を介して) を選択したときに、選択したアクティビティを VM の新しいConfigActivityGroupものにコピーすることでした(これには独自のとがあります)。次に、UI の 2 番目のリストを現在のアクティビティの ICollectionView にバインドすることができます。そのため、私のコマンドはアクティビティの ICollectionView を変更します。ただし、アクティビティを別のアクティビティ文字列に設定できない現在の新しいアクティビティを作成しようとすると、障害が発生しました(読み取り専用であるため)。ConfigActivityGroupObservableCollection<string>ViewSourceICollectionViewConfigActivityGroupConfigActivityGroupICollectionView.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/ICollectionList<string>

私は 3 番目のアプローチが正しいアプローチだと思いますが、コミュニティの意見を聞くことにオープンですこれは MVVM の私の最初の使用であり、責任を分離し、可能な限りコマンドを使用しようとしています。

追加データ:

  • ConfigActivityGroup がデータベースからロードされて VM に配置されると、UI を介して VM 自体以外のユーザーによって変更されることはありません。
4

0 に答える 0