0

TabControl Regionシェルビュー内でプリズムを使用しています。

それぞれにとTabItemが含まれます。AViewAViewModel

のプロパティプロパティTabItemを使用して、現在アクティブな を特定できます。IsActiveAViewModel

IsActiveプロパティはtrue、現在選択されている TabItem に対してのみに設定されます。

ビュー内にボタンがありShell、ビュー内のロジックを実行しますTabItems

現在のアクティブに応じてボタンを有効にして無効にする正しい方法は何ですかTabItem(セットはまたはに実行commandできます)truefalse、アクティブなビューに対してのみロジックを実行します。他のビューに配置されたボタンから?

commandを作成して を実行し、からcomposite commandにコマンドを登録し、内のボタンを にバインドすることができました。AViewModelcomposite commandshellcomposite command

このアプローチの問題点は、いずれかのコマンドが1 つ(アクティブ)falseを除くすべてを返した場合、どのコマンドも実行されないことです。TabItem

CompositeCommand クラスは、子コマンド (DelegateCommand インスタンス) のリストを維持します。CompositeCommand クラスの Execute メソッドは、各子コマンドの Execute メソッドを順番に呼び出すだけです。同様に、CanExecute メソッドは各子コマンドの CanExecute メソッドを呼び出しますが、実行できない子コマンドがある場合、CanExecute メソッドは false を返します。つまり、デフォルトでは、CompositeCommand は、すべての子コマンドを実行できる場合にのみ実行できます。 ソース

4

3 に答える 3

0

CompositeCommand は、複数のターゲットで実行するように設計されており、単一のターゲットであるアクティブなビューモデルでのみ実行するように設計されているため、使用するのは明らかに間違ったコマンドです。

コードまたは XAML のいずれも見ずにアドバイスを与えることは困難ですが、XAML が次のようになっていると仮定します。

<Grid>
 <Grid.RowDefinitions>
  <RowDefiniton Height="Auto" />
  <RowDefinition />
 </Grid.RowDefinitions>

 <Button Grid.Row="0" Content="Execute on Active" />
 <TabControl Grid.Row="1" ItemSource="{Binding TabViewModels}" prism:RegionManager.RegionName="TabRegion" IsSynchronizedWithCurrentItem="True" />

<Grid>

アクティブなアイテムでコマンドを実行する最も簡単な方法は、現在のアイテムを示す "/" 構文を使用して、Button の Command プロパティをアクティブなビューモデルの TargetCommand に設定することです。

<Button Grid.Row="0" Content="Execute on Active" Command="{Binding TabViewModels/TargetCommand}" />
于 2017-06-22T13:53:56.977 に答える