WPF / C #: Как можно ссылаться на TabItems внутри TabControl? - PullRequest
3 голосов
/ 17 февраля 2010

Я уверен, что есть кое-что простое, что мне не хватает, но я должен признаться, что на данный момент я в растерянности.

Я программно добавляю TabItems в мой основной 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 имеет коллекцию TabPages с методом ContainsKey, который я мог бы использовать для поиска имени TabPage. Я не понимаю, что ищет метод Items.Contains (), поскольку он только указывает объект в качестве аргумента и не ссылается на имя элемента!

Любая помощь очень ценится.

Спасибо!

Ответы [ 2 ]

9 голосов
/ 17 февраля 2010

Метод Contains() ищет, чтобы вы передали фактический TabItem, который вы ищете, поэтому он не поможет вам. Но это будет работать:

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

if(matchingItem!=null)
  tab_main.SelectedItem = matchingItem;
else
  ...
1 голос
/ 17 февраля 2010

Спасибо за ответы! До редактирования это не сработало, и в итоге я придумал другое подобное решение. Конечно, заставил меня задуматься в правильном направлении! Я до сих пор не совсем привык к LINQ и лямбда-выражениям.

Если кто-то еще ищет решения, это также сработало для меня:

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
    ...

И последний вопрос, если кто-нибудь читает это ... Есть ли более элегантный способ выбрать элемент из MatchItem, ссылаясь на свойство name, если предположить, что правильный элемент находится в позиции 0?

...