2013-03-27 2 views
2

Я хочу, чтобы удалить все вкладки элементов при нажатии кнопки выхода из системы Мой код приводится нижеКак удалить все вкладки, кроме одного в wpf?

foreach (object item in mainTab.Items) 
{ 
    TabItem ti = (TabItem)item; 
    if ("welcomeTabItem" != ti.Name) 
    { 
     mainTab.Items.Remove(item); 
    } 
} 

Но это создаст следующую ошибку

ошибок Коллекция была изменена; операция перечисления может не выполняться.

Есть ли какой-либо другой метод?

ответ

5

Вы можете получить нужный элемент, затем снимите элемент управления и добавить товар ,

// Note that `First` will throw an exception if the item isn't found. 
TabItem ti = mainTab.Items.First(t => t.Name == "WelcomTabItem"); 
mainTab.Items.Clear(); 
mainTab.Items.Add(ti); 

В качестве альтернативы, если "WelcomeTabItem" не может быть в Items:

TabItem ti = mainTab.Items.FirstOrDefault(t => t.Name == "WelcomTabItem"); 
mainTab.Items.Clear(); 
if(ti != null) 
    mainTab.Items.Add(ti); 
+0

Это также хорошее решение. Спасибо. Jason – manuthalasseril

+0

отлично работает благодаря –

5

Вы не можете редактировать IEnumerables в foreach Петли. insted использовать цикл for.

for (int i = mainTab.Items.Count -1; i >=0; i--) 
{ 
    TabItem ti = (TabItem)mainTab.Items[i]; 
    if ("welcomeTabItem" != ti.Name) 
    { 
    mainTab.Items.Remove(ti); 
    } 
} 
+1

Обратите внимание, что очень важно, чтобы вы уменьшали 'i', так как удаляли индексы предметов, чтобы сместить, что приведет к пропуску элементов, если вы начинаете с' 0' и увеличиваете 'i'. –

+0

Его работы. Спасибо за вашу помощь. Hoessein – manuthalasseril

1

Используйте следующий код:

var itemsToRemove = new List(TabItem); 

foreach (object item in mainTab.Items) 
{ 
    TabItem ti = (TabItem)item; 
    if ("welcomeTabItem" != ti.Name) 
    { 
    itemsToRemove.Add(item); 
    } 
} 

foreach (var itemToRemove in itemsToRemove) 
{ 
    mainTab.Items.Remove(itemToRemove); 
} 

Вы не можете удалять элементы из коллекции в то время как вы перечисляя его

3

Редактирование Перечислимый внутри Foreach не допускается

Вы можете использовать ниже LINQ код, чтобы удалить все пункты, за исключением «welcomeTabItem»:

mainTab.Items.RemoveAll(i => i.Name != "welcomeTabItem"); 
+0

. Это противоположность тому, что хочет сделать айзер. –

+0

@jacobaloysious: Ваше решение приятно, но, как сказал Джейсон, manuthalasseril собирается удалить все, кроме одного из вкладок. –

+0

@JasonWatkins: Спасибо, обновлено :) –

4

Вы можете использовать LINQ, чтобы удалить элементы, как это -

mainTab.Items.RemoveAll(ti => ((TabItem)ti).Name != "welcomeTabItem"); 

Убедитесь добавить using System.Linq; имен в верхней части файла.

Смежные вопросы