0

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;
        }
    }
}
4

0 に答える 0