2010-02-17 56 views
3

我确信有一些我很想念的东西很简单,但我必须承认,在这一点上我感到茫然。WPF/C#:如何在TabControl中引用TabItems?

我以编程方式将TabItems添加到我的主TabControl,用户选择打开的每个帐户的TabControl。在创建和添加新的TabItem之前,我想检查用户是否已经在另一个选项卡中打开了该帐户。我不想最终打开两个相同的选项卡。

这是我最初编写的代码。希望它给你一个我想要完成的想法。

if (tab_main.Items.Contains(accountNumber)) 
    { 
     tab_main.SelectedIndex = tab_main.Items.IndexOf(accountNumber); 
    } 
    else 
    { 
     Search s = new Search(queryResults, searchText); 
     TabItem tab_search = new TabItem(); 
     tab_search.Header = searchString; 
     tab_search.Name = accountNumber; 
     tab_search.Content = s; 
     tab_main.Items.Add(tab_search); 
    } 

当然这不能正常工作。在WinForms中,TabControl有一个带有ContainsKey方法的TabPages集合,我可以使用它来搜索TabPage的名称。我没有得到Items.Contains()方法正在查找的内容,因为它只将对象指定为参数,并且不引用项目的名称!

任何和所有的帮助,非常感谢。

谢谢!

回答

9

Contains()方法正在寻找你通过你正在寻找的实际TabItem,所以它不会帮助你。但这将工作:

var matchingItem = 
    tab_main.Items.Cast<TabItem>() 
    .Where(item => item.Name == accountNumber) 
    .FirstOrDefault(); 

if(matchingItem!=null) 
    tab_main.SelectedItem = matchingItem; 
else 
    ... 
+0

雷,我冒昧地编辑'Cast'。 TabControl.Items是'IEnumerable',但不是'IEnumerable ',因此它不直接支持LINQ Where操作符。 – itowlson 2010-02-17 00:47:05

+0

感谢您的回复!在编辑之前,它不起作用,我最终提出了另一个类似的解决方案。当然让我以正确的方向思考!我发现了一个非常类似的解决方案,但也有一个后续问题,如果有人有时间帮助,我会发布另一个答案! – 2010-02-17 01:18:33

1

感谢您的答复!在编辑之前,它不起作用,我最终提出了另一个类似的解决方案。当然让我以正确的方向思考!我仍然不太习惯于LINQ和lambda表达式。

万一别人正在寻找解决方案,这也为我工作:

var matchingItem = 
    from TabItem t in tab_main.Items where t.Name == searchHash select t; 

if (matchingItem.Count() != 0) 
    tab_main.SelectedItem = matchingItem.ElementAt(0); 
else 
    ... 

最后一个问题,如果任何人在读这...有一个更优雅的方式通过参考选择matchingItem元素名称属性与假定正确的元素位于位置0?

+0

不一定有“正确的元素” - 多个元素可以具有相同的Name属性。如果名称使用'INameScope.RegisterName'注册,那么'INameScope.FindName'会找到它。但是,这不是一个好的设计,有几个原因,我不会在这里列举。有了WPF,你应该使用MVVM设计,而不是老的WinForms风格的设计。查看StackOverflow和其他地方了解MVVM。 – 2010-02-17 01:35:07

+0

仅供参考:一般来说,堆栈溢出会鼓励用户提出“跟进”问题作为新问题,而不是扩展他们现有的问题。有关更多信息,请参阅meta.stackoverflow.com中的常见问题和讨论。 – 2010-02-17 02:12:25

+0

非常感谢您的纠正,并将我指向MVVM设计。 – 2010-02-17 02:46:55

相关问题