0

TabControl Region在外壳视图中使用棱镜。

每个都TabItem包含AViewAViewModel

我可以TabItem使用IsActive.AViewModel

IsActive属性设置为true仅针对当前选定的 TabItem。

我在Shell视图中有一个按钮,它负责为TabItems.

根据当前活动启用禁用按钮的正确方法是什么TabItem(设置可以执行commandtruefalse,并且只为活动视图执行逻辑。从放置在其他视图中的按钮?

我已经设法command通过创建来执行composite command,然后将命令从 注册AViewModelcomposite command,并将其中的按钮绑定shellcomposite command

这种方法的问题是,如果任何命令返回false它们都是除了一个(活动的TabItem之外的,则没有任何命令被执行。

CompositeCommand 类维护一个子命令列表(DelegateCommand 实例)。CompositeCommand 类的 Execute 方法只是在每个子命令上依次调用 Execute 方法。CanExecute 方法类似地调用每个子命令的 CanExecute 方法,但是如果任何子命令无法执行,CanExecute 方法将返回 false。换句话说,默认情况下,只有当所有子命令都可以执行时,才能执行 CompositeCommand。 资源

4

3 回答 3

1

如果您使用的是 CompositeCommand,并且只想在活动选项卡上调用该命令,那么让您的 ViewModel 实现 IActiveAware。然后在 CompositeCommand 的 ctor 中,true作为参数传递。然后,这将仅监视活动选项卡。

于 2017-06-26T23:37:48.517 回答
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 回答
0

创建选项卡的视图模型和 shell 的视图模型都知道的服务。当标签视图模型处于活动状态时,它将宣布为服务。shell 视图模型要么查看命令的服务(后者又转发到活动的选项卡视图模型),或者(首选)服务托管命令并仅使用选项卡视图模型提供的信息。

于 2017-06-22T05:56:04.843 回答