WPF如何为当前活动的tabitem执行命令?

时间:2017-06-21 12:32:37

标签: wpf mvvm prism tabcontrol delegatecommand

我在shell视图中使用prism TabControl Region

每个TabItem包含AViewAViewModel

我可以使用TabItem中的属性IsActive属性确定当前有效的AViewModel

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

我在Shell视图中有一个按钮,它负责执行TabItems内视图的逻辑。

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

我设法通过创建command来执行composite command,然后将命令从AViewModel注册到composite command,然后绑定shell内的按钮1}}到composite command

这种方法的问题是,如果任何命令返回false除了一个 (活跃的TabItem ,没有执行任何命令。

  

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

创建选项卡的视图模型和shell的视图模型都知道的服务。当选项卡视图模型变为活动状态时,它会向服务宣告自己。 shell视图模型要么查看命令的服务(谁又转发到活动选项卡视图模型),要么(首选),服务托管命令并只使用选项卡视图模型提供的信息。

答案 2 :(得分:0)

CompositeCommand显然是错误的命令,因为它被设计为在多个目标上执行,而您只希望它在单个目标上执行,即活动视图模型。

在没有看到代码或XAML的情况下,很难给出建议,但假设XAML看起来像这样:

data TableC;
    set TableB;
    by name;

    length t_tips $ 1000;
    retain t_tips;

    if (first.name) then
        do;
            t_tips=strip(tips);
        end;
    else
        do;
            t_tips=strip(tips) ||", "||strip(t_tips);
        end;

    if (last.name) then output;
    drop tips;
run;

然后,对活动项执行命令的最简单方法是使用&#34; /&#34;将Button上的Command属性设置为活动视图模型的TargetCommand。语法,表示当前项目。

<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" IsSynchronisedWithCurrentItem="True" />

<Grid>