代码之家  ›  专栏  ›  技术社区  ›  GraemeF

当wpf选项卡控件至少包含一个选项卡时,如何确保它始终具有选定的选项卡?

  •  11
  • GraemeF  · 技术社区  · 16 年前

    我有一个 TabControl 其项绑定到 ObservableCollection :

    <TabControl ItemsSource="{Binding MyObservableCollection}" />
    

    当从集合中添加和删除项时,将按预期添加和删除选项卡。然而, SelectedItem 每当集合为空时,将恢复到-1(表示没有选定的选项卡)。然后,添加项目时, 选择项目 保持在-1,并且未选择新选项卡。

    我怎么做 选项卡控件 每当向空集合中添加项时,是否选择新选项卡?

    6 回复  |  直到 16 年前
        1
  •  12
  •   Steven Robbins    16 年前

    可能有一种更简单的方法,但可以将Collection Changed事件挂接到VM中的ObservableCollection上,并将SelectedItem属性设置为新项(假定已将所选项绑定到VM上的某个属性)。

        2
  •  3
  •   Kiril Stanoev    16 年前

    您可以订阅tabcontrol.itemcontainerGenerator.statusChanged事件,如果状态为containersGenerated且tabcontrol的selectedIndex为-1,则使tabcontrol的selectedIndex为0;

    // peopleCollection is an ObservableCollection<Person>
    People peopleCollection = new People();
    public Window1()
    {
        InitializeComponent();
        // MyTabControl is an instance of TabControl
        MyTabControl.ItemsSource = peopleCollection;
        MyTabControl.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);
    }
    
    void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
    {
        if((sender as ItemContainerGenerator).Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated && MyTabControl.SelectedIndex == -1)
        {
            MyTabControl.SelectedIndex = 0; 
        }
    }
    

    第三方解决方案具有现成的功能。每当集合的状态从“空”更改为“包含单个项”时,telerik的radtabcontrol将选择第一个项。

    在这里尝试演示: http://demos.telerik.com/silverlight/#TabControl/AddingAndRemovingTabs

    注意:这是一个SL演示,但它在WPF中的工作原理相同。

        3
  •  2
  •   Jobi Joy    16 年前

    如果要查找纯MVVM实现,请向ViewModel添加一个索引属性,并且在CollectionChanged上,如果其中没有项,则可以设置index=0。在XAML中,可以按如下方式绑定该索引

    <TabControl ItemsSource="{Binding MyObservableCollection}" SelectedIndex="{Binding Index}" />
    
        4
  •  0
  •   RoelF    16 年前

    最好的办法是覆盖“ontabaded”功能,检查是否添加了新功能(第一个),然后将selecteditemindex设置为0;

    因为您使用的是ObservableCollection,所以您知道您的集合何时更改,所以我将从集合中订阅更改的事件,并检查其中的项数。

        5
  •  0
  •   Anya Hope    9 年前

    我遇到了同样的问题,并通过将所选项目绑定到动态列表中的第一个项目来解决它。

    <TabControl ItemsSource="{Binding MyObservableCollection}" SelectedItem="{Binding MyObservableCollection.First}" />
    

    为我工作:)

        6
  •  0
  •   Mihail Shishkov    9 年前
    <TabControl ItemsSource="{Binding MyObservableCollection}" SelectedItem="{Binding MyObservableCollection[0]}" />