У меня есть TabControl в MVVM приложение WPF, Он определяется следующим образом.
<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 позади них, и поэтому все взаимодействуют без проблем.
Моя проблема в том, что когда пользователь переходит к родительскому окну, я хочу, чтобы элемент управления табуляции по умолчанию был вторым элементом табуляции. Это легко сделать при первом загрузке окна, указав в XAML IsSelected="True"
в TabItem номер 2. Это менее легко сделать, когда пользователь переходит от экрана, а затем возвращается к нему.
Я думал о наличии свойства SelectedItem={Binding SelectedTabItem}
в элементе управления вкладкой, поэтому я мог программно установить выбранную вкладку в ViewModel, но проблема в том, что я не знаю объектов TabItem в ViewModel, поскольку они объявлены выше в только XAML, поэтому у меня нет объекта TabItem для перехода к свойству setter.
Одна из моих идей заключалась в том, чтобы сделать дочерние представления (которые составляют содержимое каждого из элементов табуляции выше) имеют стиль на уровне UserControl их XAML, что-то вроде следующего.
<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>
Я знаю, что бит findcanestor неверен; Я просто поставил его там, чтобы указать свои намерения, но я не уверен в точном синтаксисе. В основном для каждого UserControl есть триггер, который прослушивает свойство в ViewModel (не уверен, как бы я различал каждый отдельный UserControl, поскольку, очевидно, они не могут все прослушивать одно и то же свойство или все они будут выбирать одновременно, когда свойство установлено на Правда, но наличие свойства для каждого usercontrol кажется уродливым), а затем находит свой родительский контейнер TabItem и устанавливает значение IsSelected равным true.
Я на правильном пути с решением здесь? Можно ли делать то, что я обдумываю? Есть ли более аккуратное решение?