2010-02-17 84 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

相關問題