DataTemplateSelector を使用して Content を TabControl に設定した ContentControl があります。ItemsSource が bool IsSelected プロパティを持つようにバインドされているアイテムは、タブの IsSelected プロパティが Style で TwoWay Setter を使用してリンクされています。
別のテスト アプリで問題を再現しようとしましたが、再現できません。アイテムの IsSelected プロパティに基づいて、タブが期待どおりに選択されています。
この問題が発生しているメイン アプリケーションで私が見ているのは、ContentControl に DataContext が設定されるたびに、最初のタブが選択されてからタブが選択されないということです。この動作は、Setter を削除することにより、次の例で確認できます。
これをデバッグする最善の方法についてのガイダンスが必要です。誰かがそれを見たい場合は、メインのアプリケーション ソースを利用できるようにすることができます。
<Window x:Class="SelectedTab.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SelectedTab"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:NodeViewDataTemplateSelector x:Key="NodeViewDataTemplateSelector" />
<DataTemplate x:Key="Tab">
<TabControl ItemsSource="{Binding Nodes}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}"></TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<!--Remove this Setter to see the behaviour that I am seeing in the main application-->
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"></Setter>
</Style>
</TabControl.ItemContainerStyle>
<TabControl.ContentTemplate>
<DataTemplate>
<ContentControl Content="{Binding }" ContentTemplateSelector="{StaticResource NodeViewDataTemplateSelector}" ></ContentControl>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<Button Content="English" Click="ButtonOne_OnClick"/>
<Button Content="German" Click="ButtonTwo_OnClick"/>
<Button Content="French" Click="ButtonThree_OnClick"/>
</StackPanel>
<ContentControl Name="Content" Grid.Row="1" Content="{Binding }" ContentTemplateSelector="{StaticResource NodeViewDataTemplateSelector}" ></ContentControl>
</Grid>
</Window>
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
namespace SelectedTab
{
public partial class MainWindow : Window
{
private Node nodeOne;
private Node nodeTwo;
private Node nodeThree;
public MainWindow()
{
InitializeComponent();
nodeOne = new Node();
nodeOne.Nodes = new ObservableCollection<Node>();
nodeOne.Nodes.Add(new Node { Text = "One" });
nodeOne.Nodes.Add(new Node { Text = "Two", IsSelected = true });
nodeOne.Nodes.Add(new Node { Text = "Three" });
nodeOne.Nodes.Add(new Node { Text = "Four" });
nodeTwo = new Node();
nodeTwo.Nodes = new ObservableCollection<Node>();
nodeTwo.Nodes.Add(new Node { Text = "Ein" });
nodeTwo.Nodes.Add(new Node { Text = "Zwei" });
nodeTwo.Nodes.Add(new Node { Text = "Drei", IsSelected = true });
nodeTwo.Nodes.Add(new Node { Text = "Vier" });
nodeThree = new Node();
nodeThree.Nodes = new ObservableCollection<Node>();
nodeThree.Nodes.Add(new Node { Text = "Un" });
nodeThree.Nodes.Add(new Node { Text = "Deux" });
nodeThree.Nodes.Add(new Node { Text = "Troix" });
nodeThree.Nodes.Add(new Node { Text = "Quatre", IsSelected = true });
}
private void ButtonOne_OnClick(object sender, RoutedEventArgs e)
{
Content.DataContext = null;
Content.DataContext = nodeOne;
}
private void ButtonTwo_OnClick(object sender, RoutedEventArgs e)
{
Content.DataContext = null;
Content.DataContext = nodeTwo;
}
private void ButtonThree_OnClick(object sender, RoutedEventArgs e)
{
Content.DataContext = null;
Content.DataContext = nodeThree;
}
}
public class Node
{
public string Text { get; set; }
public bool IsSelected { get; set; }
public ObservableCollection<Node> Nodes { get; set; }
}
class NodeViewDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
Node node = item as Node;
if (node != null && node.Nodes != null)
{
return Application.Current.MainWindow.FindResource("Tab") as DataTemplate;
}
return null;
}
}
}