0

Views(UserControls) を追加する Canvas を備えた MainWindowView(Window) があります。

MainWindow の Canvas は Canvas から派生した Custom Canvas であるため、この中の View をあちこちに移動したり、前面に出したり戻したりすることができます。

コマンドをボタンにバインドして、MainWindowView のキャンバスにビューを追加します。ボタンをクリックすると、キャンバスにビューが追加されます。

しかし、私の問題は、既に MainViewModel のキャンバスにあるビューの ViewModel から MainViewModel の同じキャンバスに別のビューを追加したいということです。

Canvas をバインドするために使用した ObservableCollection は MainViewModel にあるため、MainViewModel からのみ View を追加できます。

他の ViewModel から MainViewModel を使用しようとすると、新しいオブジェクトを作成する必要があります。これにより、キャンバス内の古いビューが新しいビューに置き換えられます。

これに対する解決策はありますか。そうでない場合、MVVMフレームワークを使用することの用途は何ですか。助けてください...

4

2 に答える 2

1

私はこれを正しく理解していますか: あなたのコントロールの DataContext は Window のものとは異なり、そこからアクセスする必要がありますか?

基本的に、これは設計によって回避できた可能性があります (依存性注入を使用して MainViewModel インスタンスをコマンドに取得します) が、実際には、これを解決する WPF/MVVM フレンドリーな方法があります。

コマンドを使用して MainViewModels ObservableCollection にコントロールを追加する

<Button Command="{Binding Path=CreateViewCommand}" CommandParameter="{Binding}" />

コントロール (ビューと呼ばれるもの) から、Ancestor Binding を使用する必要があります。

<Button Command="{Binding Path=DataContext.CreateViewCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"
    CommandParameter="{Binding Path=DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>

コマンドでは、パラメーターを元のタイプ (MainViewModel) にキャストし、必要に応じて操作できます。

于 2012-05-03T13:13:41.980 に答える