2017-05-04 4 views
1

シナリオはこれです:シェル内のボタンを、ロードされたモジュールのviewmodelで定義されたコマンドにバインドするにはどうすればよいですか?

私はWPF、MVVM、プリズム6.3.0で開発されたアプリケーションを持っています。このアプリは、と考えて

  • Shell.xaml(シェル)
  • UserControl1.xaml(モジュール内、independientクラスライブラリ)

私はシェルで定義されたボタンをクリックすると、私は期待しますコマンドが実行され、CanExecuteで定義された条件が検証されます。しかし、このコマンドは、モジュールのビューモデルであるViewModelクラスに定義されています(このアプリケーションでは、複数のモジュールがプリズムとして実装されています)。

呼び出すには、シェルのリソースコレクションにlocalviewmodelを定義しようとしました。これにより、コマンドがトリガされますが、CanExecuteという条件はトリガされません。

ユーザーコントロールで定義されたXAMLコードをモジュール内に配置すると(つまり、コンテンツ領域マネージャーを使用しない単純なアプリケーションをコードする場合)、単一ページのXAMLアプリケーションである場合、コマンドはCanExecute問題なく。私の推測は、モジュールviewmodelで定義されたコマンドをシェルのボタンにバインドする際の問題です。それについてたくさん読んで、私はバインディングを宣言する正しい方法を得ていない。

はここに例を示します

MyRecordsはデータを保持しているGridViewコントロールの名前で、LocalViewModelがロードされたモジュールで定義されたビューモデルのインスタンスのキーである
<Telerik:RadRibbonView x:Name="BarraHerramientas" Grid.Row="0" 
          DockPanel.Dock="Top" 
          ContentHeight="130" 
          Height="160" 
          Template="{DynamicResource RadRibbonViewStyle}" 
          MinimizeButtonVisibility="Visible" 
          HelpButtonVisibility="Visible" Background="Red"> 
     <Telerik:RadRibbonTab Header="1" 
           Style="{DynamicResource RadRibbonTabStyle}" 
           IsSelected="True" 
           TabIndex="0"> 
      <Telerik:RadRibbonGroup Header="RibbonGroup1" 
            DialogLauncherVisibility="Visible"> 
       <Telerik:RadRibbonButton CollapseToMedium="Never" 
             CollapseToSmall="WhenGroupIsMedium" 
             IsAutoSize="True" 
             LargeImage="Agregar.png" 
             Size="Large" 
             SmallImage="Agregar_16x16.png" 
             Text="Add..." 
             Command="{Binding AddRecordCommand, Source={StaticResource LocalViewModel}}" 
             CommandTarget="{Binding ElementName=MyRecords}" 
             CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" " 
             Telerik:ScreenTip.Description="..." /> 
      </Telerik:RadRibbonGroup> 
     </Telerik:RadRibbonTab> 
</Telerik:RadRibbonView> 

。したがって、LocalViewModelの時点では、Shell.xaml内のリソースとして定義されたインスタンスと、「MyRecords」GridViewを保持するロード済みのModuleに定義されたインスタンスの2つのインスタンスがあります。

1ページの例を使用すると、これは完璧に機能します。いくつかのモジュールを書く必要があるので、それぞれが独自のViewModel、または複数のモジュールを定義します。それで、シェルのから異なるモジュールのビューモデルに定義されたコマンドを使用する必要があるからです。シェルで各ViewModelを宣言すると(多くのデータが入ってくる)、おそらくパフォーマンスの問題になります。

したがって、「オンデマンド」でロードされるモジュールのリソースとしてViewModelで定義された(シェルからの)コマンドを呼び出すにはどうすればよいですか?

ありがとうございました。

答えて

0

目的を達成するにはいくつかの方法があります。 1つの方法は、CompositeCommandを使用することです。 ShellViewModelにパラメータとして使用するデータが常に含まれている場合、これが有効です。各ViewModelは、親CompositeCommandをサブスクライブすることができ、CompositeCommandが呼び出されるたびに、登録されたすべてのVMコマンドも呼び出されます。あなたはここにCompositeCommandsのサンプルを見ることができます:

https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/12-UsingCompositeCommands

別のアプローチは、それぞれを注入し、あなたのリボンのボタンを使用して、シェルに注入閲覧させることです。したがって、各ビューは、シェル領域内のビューを追加/削除するときに、どのタブをリボンに追加/削除する必要があるかを認識します。従属ビューのロード::あなたはプリズムの問​​題に私のPluralsight過程で&ソリューションをそれを行うにはどのように見ることができます

https://www.pluralsight.com/courses/prism-problems-solutions

+0

ブライアンは、あなたの応答に感謝...私は今、それを理解するためにその例を読んでいます。詳細を追加するには、コンボボックスの値に応じて、リボンビューのボタンをアクティブ/非アクティブにすることができます。これは、モジュールのViewModelでSelectedItemプロパティを保持します。これは、そのプロパティの変更に反応するためにリボンビューのボタンが必要だったためです。問題は、プロパティがシェルではなくモジュール内のViewModelにあることです。つまり、ShellはViewModelのモデルを認識していません。私はこれを正しく見ていますか? は、チャーリーです。 –

+0

アプリケーションアーキテクチャーは、SOのコメントで簡単に説明または解決できるものではありません。私はあなたのアプリがどのように構造化されているか、あるいはあなたの必要条件を知っていません。アプローチを学んでシナリオに知識を適用することをお勧めします。 –

関連する問題