【发布时间】:2015-05-20 10:24:27
【问题描述】:
我有一个ListView,它允许我选择项目,然后将其添加到ObservableCollection。这个ObservableCollection 绑定到TabControl,所以我在添加项目时会得到新的标签。我想要的是每个新选项卡都被选中并自动显示其内容。
从内容的角度来看,这是可行的。我能够按预期看到新添加的项目的内容,但是从TabControl 本身的外观来看,所有选项卡都已“取消选择”或移至背景。
这是我正在做的事情:(请注意,我正在设置 SelectedItem。我在设置 SelectedIndex 或 SelectedValue 时遇到了类似的结果。不确定这里的最佳选择。)
void MyCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
List<MyClass> newStuff = e.NewItems.Cast<MyClass>().ToList<MyClass>();
if (newStuff.Count == 1)
myTabControl.SelectedItem = newStuff[0];
}
}
使用Console.WriteLine 和TabControl 的SelectionChanged 事件,我可以验证TabControl.SelectedIndex 是否按预期更改。但是,对于每个新项目,所有选项卡似乎都移到了后台。
我总是看到新项目的内容,但我必须手动单击选项卡才能使其在视觉上显示为前景选项卡。
每当我单击应该已经在前台的后台选项卡时,我的控制台通常会显示一条多余的调试消息。
例如,如果我从集合中的零个项目开始,然后添加一个,我会得到一个背景选项卡、一个控制台消息,并且我会看到项目的内容。如果我单击选项卡,它会进入前台,并且 SelectionChanged 方法会触发(!!!),在我盯着相同的项目内容时重复相同的控制台消息:
myTabControl now has SelectedIndex of 0
myTabControl now has SelectedIndex of 0
如何以编程方式显示新选项卡的内容,并将该选项卡视为前景选项卡?
我可以通过编程将任何选项卡置于前台的唯一方法是设置myTabControl.SelectedIndex = -1。显然,当ObservableCollection 包含项目时,这不是一个选项,因此这会强制TabControl 将第一个选项卡(内容、标题和所有)移动到前台。我在这里错过了什么?
更正:使用这种方法(设置SelectedItem)我确实在前台获得了第一个选项卡,但是创建选项卡#2 和所有后续选项卡会取消选择所有选项卡,同时显示来自最近添加的。
【问题讨论】:
标签: c# wpf tabcontrol selecteditem selectedindex