我在MVVM WPF应用程序中有一个 TabControl 。定义如下。
<TabControl Style="{StaticResource PortfolioSelectionTabControl}" SelectedItem="{Binding SelectedParameterTab}" >
<TabItem Header="Trades" Style="{StaticResource PortfolioSelectionTabItem}">
<ContentControl Margin="0,10,0,5" Name="NSDetailTradeRegion" cal:RegionManager.RegionName="NSDetailTradeRegion" />
</TabItem>
<TabItem Header="Ccy Rates" Style="{StaticResource PortfolioSelectionTabItem}">
<ContentControl Margin="0,10,0,5" Name="NSDetailCcyRegion" cal:RegionManager.RegionName="NSDetailCcyRegion" />
</TabItem>
<TabItem Header="Correlations / Shocks" Style="{StaticResource PortfolioSelectionTabItem}">
<ContentControl Name="NSDetailCorrelationRegion" cal:RegionManager.RegionName="NSDetailCorrelationRegion" />
</TabItem>
<TabItem Header="Facility Overrides" Style="{StaticResource PortfolioSelectionTabItem}" IsEnabled="False">
<ContentControl Name="NSDetailFacilityOverrides" cal:RegionManager.RegionName="NSDetailFacilityOverrides" />
</TabItem>
</TabControl>
因此,每个选项卡项内容都有自己的关联视图。这些视图中的每一个都具有MEF [Export]
属性并通过视图发现与相关区域相关联,因此上面的代码就是我需要加载选项卡控件并在它们之间切换的全部内容。它们都引用了它们背后的相同共享 ViewModel 对象,因此都可以无缝交互。
我的问题是,当用户导航到父窗口时,我希望选项卡控件默认为第二个选项卡项。这在第一次加载窗口时很容易做到,只需在 XAMLIsSelected="True"
中指定 TabItem 编号 2。当用户离开屏幕然后返回屏幕时,就不太容易做到了。
我想过SelectedItem={Binding SelectedTabItem}
在选项卡控件上有一个属性,所以我可以在 ViewModel 中以编程方式设置选定的选项卡,但问题是我不知道 ViewModel 中的 TabItem 对象,因为它们仅在上面的 XAML 中声明,所以我没有要传递给 setter 属性的 TabItem 对象。
我的一个想法是让子视图(形成上面每个选项卡项的内容)在其 XAML 的 UserControl 级别上具有样式,如下所示。
<Style TargetType={x:Type UserControl}>
<Style.Triggers>
<DataTrigger Property="IsSelected" Value="True">
<Setter Property="{ElementName={FindAncestor, Parent, typeof(TabItem)}, Path=IsSelected", Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
我知道 findancestor 位不正确;我只是把它放在那里以说明我的意图,但我不确定确切的语法。基本上每个 UserControl 都有一个监听 ViewModel 上的属性的触发器(不确定我将如何区分每个不同的 UserControl,因为显然它们不能都监听相同的属性,或者当属性设置为时它们都会同时选择是的,但每个用户控件都有一个属性看起来很难看),然后找到它的父 TabItem 容器并将 IsSelected 值设置为 true。
我在正确的轨道上找到解决方案了吗?有没有可能做我正在思考的事情?有没有更整洁的解决方案?