【发布时间】:2013-11-20 08:27:26
【问题描述】:
我在 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 对象,因此都可以无缝交互。
我的问题是,当用户导航到父窗口时,我希望选项卡控件默认为第二个选项卡项。在第一次加载窗口时,这很容易做到,只需在 TabItem 编号 2 中的 XAML 中指定 IsSelected="True"。当用户离开屏幕然后返回屏幕时,就不太容易做到了。
我曾想过在选项卡控件上有一个SelectedItem={Binding SelectedTabItem} 属性,这样我就可以在 ViewModel 中以编程方式设置选定的选项卡,但问题是我不知道 ViewModel 中的 TabItem 对象,因为它们在上面声明仅限 XAML,所以我没有 TabItem 对象可以传递给 setter 属性。
我的一个想法是让子视图(形成上面每个选项卡项的内容)在其 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。
我是否在正确的轨道上找到解决方案?有没有可能做我正在思考的事情?有没有更简洁的解决方案?
【问题讨论】:
-
为什么不创建将选择第二个标签的事件?
-
理想情况下,我想在 MVVM 中执行此操作,因此后面没有任何代码。同意我可以在后面的代码中添加一个事件,但希望有一个 MVVM 解决方案
-
TabItem 在 MVVM 中没有意义。 TabItem 只是 UI。 SelectedTab 行为将在后面的代码中。
-
@user1122909 您可以使用交互库,然后,例如,当您的应用程序将获得焦点或其他事件时,取决于您的需要,您可以在 viewModel 中而不是在代码中编写方法后面。
标签: wpf mvvm prism tabcontrol