Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF/C:如何在TabControl中引用TabItems?_C#_Wpf_Tabcontrol_Tabitem - Fatal编程技术网

C# WPF/C:如何在TabControl中引用TabItems?

C# WPF/C:如何在TabControl中引用TabItems?,c#,wpf,tabcontrol,tabitem,C#,Wpf,Tabcontrol,Tabitem,我确信我遗漏了一些简单的东西,但我必须承认,在这一点上,我感到不知所措 我以编程方式将TabItems添加到主TabControl中,用户选择打开的每个帐户对应一个TabItems。在创建和添加新的TabItem之前,我想检查用户是否已经在另一个选项卡中打开了帐户。我不想最后打开两个相同的选项卡 这是我最初编写的代码。希望它能让你了解我正在努力实现的目标 if (tab_main.Items.Contains(accountNumber)) { tab_main.

我确信我遗漏了一些简单的东西,但我必须承认,在这一点上,我感到不知所措

我以编程方式将TabItems添加到主TabControl中,用户选择打开的每个帐户对应一个TabItems。在创建和添加新的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有一个TabPages集合,其中包含一个ContainsKey方法,我可以使用该方法搜索TabPages的名称。我不知道Items.Contains方法在寻找什么,因为它只指定一个对象作为参数,不引用项的名称

非常感谢您的任何帮助

谢谢

Contains方法正在寻找您要传递的实际TabItem,因此它对您没有帮助。但这将起作用:

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

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

谢谢你的回复!在编辑之前,它不起作用,我最后想出了另一个类似的解决方案。当然让我想到了正确的方向!我还不太习惯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
    ...

最后一个问题,如果有人在读这个。。。通过引用name属性而不是假设正确的元素位于位置0,是否有一种更优雅的方法从matchingItem中选择元素?

Ray,我在一个调用Cast的过程中自由地进行了编辑。TabControl.Items是IEnumerable但不是IEnumerable,因此它不直接支持LINQ Where操作符。感谢您的回复!在编辑之前,它不起作用,我最后想出了另一个类似的解决方案。当然让我想到了正确的方向!我找到了一个非常类似的解决方案,但也有一个后续问题,如果有人有时间帮忙,我会将其作为另一个答案发布!不一定存在正确的元素-多个元素可以具有相同的Name属性。如果名称是使用INameScope.RegisterName注册的,则INameScope.FindName将找到它。然而,这不是一个好的设计,原因有几个,我在这里不再列举。对于WPF,您应该使用MVVM设计,而不是旧的WinForms样式的设计。查看StackOverflow和其他地方了解MVVM。仅供参考:通常,StackOverflow鼓励用户将后续问题作为新问题提出,而不是扩展现有问题。有关更多信息,请参阅meta.stackoverflow.com中的常见问题解答和讨论。非常感谢您的更正并向我介绍MVVM设计。