我在shell视图中使用prism TabControl Region
。
每个TabItem
包含AView
和AViewModel
。
我可以使用TabItem
中的属性IsActive
属性确定当前有效的AViewModel
。
IsActive
属性仅对当前选定的TabItem设置为true
。
我在Shell
视图中有一个按钮,它负责执行TabItems
内视图的逻辑。
根据当前有效TabItem
启用禁用按钮的正确方法是什么(设置可以执行command
到true
或false
)< / em> ,并仅为活动视图执行逻辑。从放在其他视图中的按钮?
我设法通过创建command
来执行composite command
,然后将命令从AViewModel
注册到composite command
,然后绑定shell
内的按钮1}}到composite command
。
这种方法的问题是,如果任何命令返回false
除了一个 (活跃的TabItem
) ,没有执行任何命令。
CompositeCommand类维护一个子命令列表 (DelegateCommand实例)。的执行方法 CompositeCommand类只是在每个上调用Execute方法 子命令依次。 CanExecute方法类似地调用 每个子命令的CanExecute方法,但是如果有任何子命令 命令无法执行,CanExecute方法将返回false。 换句话说,默认情况下,只能执行CompositeCommand 当所有子命令都可以执行时。 Source
答案 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>