1

検索しましたが、必要な場所にたどり着くのに役立つものは何もありません。

問題の説明:

  1. 複数のビュー (ユーザー コントロール) をホストする単一のダイアログ ウィンドウがあります。[次へ] および [戻る] をクリックすると、ウィザードのように、このダイアログ内で前後に移動します。

  2. 6 つのダイアログのうち、4 つのダイアログが同じコア データを参照しています。たとえば、 ObservableCollection と言います

  3. その場合、すべてこの同じ ObservableCollection を参照する必要がある 4 つの viewModel があります。「ウィザード」ダイアログの新しいステップに進むたびに、リストを保存して再ロードしたくありません。

私の質問は、これを達成するための最良/最も実用的な方法は何ですか.

私が考慮した次のこと:

  1. 静的クラス
  2. シングルトン - うーん
  3. ビュー間でパラメーターを渡す (ただし、nextlocation と previouslocation は非常に汎用的であるため、これは困難です)。
  4. メディエーターのパターン?メディエーター パターンに関する私の問題は、ビュー間で「通信」したくないことです。すべてのビューで同じデータ ソースを共有したいだけです。
  5. オブザーバーパターン?ObservableCollections を使用して INotifyPropertyChanged を実装している場合、変更を誰かに通知する必要はありません。

この問題を解決するために必要な追加情報をお知らせください。喜んで提供いたします。

私はデザインをしているので、コード例を実際に探しているわけではありません。コード例が設計を説明するのに役立つなら、私はそれで大賛成です。

最後に、私はフレームワークを使用していないため、EventAggregator はオプションではありません (EventAggregator を正しく理解していない場合を除きます)。

前もって感謝します!!

4

5 に答える 5

5

ランドルフが言ったように、DIはうまくいくでしょう。私はMEFとCreationPolicyを共有したコンストラクターインジェクションでこれを行います。4view で処理したいものを 1 つのエクスポート クラスに入れるだけです。それはどれほど簡単ですか:)

ところで:メディエーターパターンは、ビューではなくビューモデル間で「通信」しています。

[Export]
public class MyClassWichHasDataSharedFor4Views {}

public class Viewmodel1
{
   [ImportingContructor] 
   public Viewmodel1(MyClassWichHasDataSharedFor4Views shareddata)
   {}
}

public class Viewmodel2
{
   [ImportingContructor] 
   public Viewmodel2(MyClassWichHasDataSharedFor4Views shareddata)
   {}
}

public class Viewmodel3
{
   [ImportingContructor] 
   public Viewmodel3(MyClassWichHasDataSharedFor4Views shareddata)
   {}
}

public class Viewmodel4
{
   [ImportingContructor] 
   public Viewmodel4(MyClassWichHasDataSharedFor4Views shareddata)
   {}
}

4 つのビューモデルがコア データへの参照を持つようになりました

于 2012-09-17T05:54:19.290 に答える
3

ダイアログの説明とその仕組みに基づいて、ViewModel「ウィザード」全体を制御するものがあります。

これには以下DialogWizardViewModelが含まれます。

  • ObservableCollection<SomeModel> Data
  • ObservableCollection<ViewModelBase> DialogWizardViews
  • ViewModelBase SelectedView
  • ICommand NextCommand
  • ICommand BackCommand

へのバインドのようDialogViewなものが含まれ、/コマンドは単純にを次または前のビューに切り替えますContentControlSelectedViewNextBackSelectedViewDialogWizardViews

例えば、

<DockPanel>
    <StackPanel DockPanel.Dock="Bottom" 
                Orientation="Horizontal" 
                HorizontalAlignment="Center">
        <Button Command="{Binding BackCommand}" Content="Back" />
        <Button Command="{Binding NextCommand}" Content="Next" />
    </StackPanel>

    <ContentControl Content="{Binding SelectedView}" />
</DockPanel>

を最初に作成するとき、または好みに応じてを切り替えるたびに、Dataを子 ViewModel に設定できます。DialogWizardViewsSelectedView

DialogWizardViews = new ObservableCollection<ViewModelBase>()
{
    new DialogViewModel1(Data),
    new DialogViewModel2(),
    new DialogViewModel3(Data),
    new DialogViewModel4(Data),
    new DialogViewModel5(Data),
    new DialogViewModel6()
};

SelectedView = DialogWizardViews.FirstOrDefault();

MVVMを使用すると、ユーザーが ViewModel とやり取りするためのユーザー フレンドリーなインターフェイスを提供するだけで、自分ViewModels アプリケーションになります。Views理想的には、テスト スクリプトやコンソール アプリケーションなどからアプリケーション全体を実行できるようにする必要がありますView

何かを渡す必要がある場合は、アプリケーション階層内の親オブジェクトで処理するか、PrismEventAggregatorや MVVM Lightなどの通信システムを使用する必要がありますMessenger。これらのオブジェクトを利用するためにフレームワーク全体を使用する必要はありません。関心のある部分を選択するだけで済みます。

于 2012-09-14T19:45:04.897 に答える
3

この質問が出されてから長い時間が経っていることは知っていますが、同じ問題で苦労した後、 ここでの RayBurns の回答は、ビューモデルを作成する必要があると感じる必要がないという本当にシンプルで安心できる認識に到達するのに本当に役立ちましたユーザーコントロールごとに。私は現在、状態がすべて互いに関連している関連情報のファミリーとしての進化に関するCollectionさまざまなビューの束に対して、1 つのビューモデルを使用しています。

それ以外の場合、実際にビューモデル間でデータを共有する必要がある場合は、@blindmeis が示すように、コンストラクターへのパラメーターとしてこれを絶対に行います。

そもそも (私にとっては!) DataContext がどのようにセットアップされ、共有されるかという性質は、View のコード ビハインドにあるようです。そこに置いたのはこれだけですが、これにより、Entity Framework で ObjectContext を共有したり、1 つのビューと複数のビューモデルとのマスター/詳細関係を確立したりできます。

リポジトリの「上位レイヤー」を形成することも素晴らしいですが、データが宛先に到達する前に、データを何度もコピー/転送していることに注意してください。

とにかく、それは私の 2 セントです。それが役に立てば幸い。多くの不快感を味わった後、最終的にはそこに収斂したのです。

于 2013-02-14T18:28:29.400 に答える
1

あなたのビューは同じModelを共有しているように思えます。これは観察可能でなければならず、ViewModels はすべてさまざまな方法でモデルを表す必要があります。

Model と ViewModels が Observer パターンを実装している場合、それが最もクリーンで「正しい」アプローチのようです。

于 2012-09-14T19:04:26.110 に答える
0

単純な「依存性注入」が機能するはずです。2 番目のビューモデルのコンストラクターは、そのコンストラクターに注入された共有データ パラメーターに依存します。

于 2012-09-14T19:03:09.113 に答える