2017-02-14 1 views
0

Я ищу способ узнать, содержит ли мое listview значение. Ниже мой код.Найти пункт в listview с gridview и WPF

public class OnlineUserList 
{ 
    public string Name { get; set; } 
    public string Color { get; set; } 
} 

<ListView x:Name="lvOnlineUsers" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SelectionMode="Single" SelectionChanged="lvOnlineUsers_SelectionChanged"> 
      <ListView.View> 
       <GridView x:Name="lvOnlineUsersGridView" AllowsColumnReorder="False"> 
        <GridViewColumn Header="Online Users" Block.TextAlignment="Center" TextOptions.TextFormattingMode="Display" TextBlock.FontWeight="Bold"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Name="tbOnlineUsersGridView" Text="{Binding Path=Name}" Foreground="{Binding Path=Color}" HorizontalAlignment="Center" VerticalAlignment="Center" TextOptions.TextFormattingMode="Display" Style="{StaticResource ResourceKey=lblLabel}" /> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView> 

public void AddUserToList(string username) 
{ 
    lvOnlineUsers.Items.Add(new OnlineUserList { Name = username, Color = "Black" }); 
} 

Теперь это, где я имею вопрос

public void RemoveUserFromList(string username) 
{ 
    if(lvOnlineUsers.Items.Contains(username)) 
     lvOnlineUsers.Items.Remove(username); 
} 

ответ

1

Вы должны научиться MVVM.

В то же время, поставьте элементы в ObservableCollection и назначьте его свойству ItemsSource listview в своем коде. После этого повторите за мной: Никогда, никогда не прикасайтесь к lvOnlineUsers.Items. Никогда никогда никогда. Забудьте, что он существует. Все, что вы делаете, вы взаимодействуете с ObservableCollection. Найдите его, добавьте в него элементы, удалите из него элементы. Пользовательский интерфейс будет волшебным и таинственным обновлением.

Я собираюсь предположить, что это находится в MainWindow. Если это находится в другом представлении, конструктор будет иметь другое имя.

public MainWindow() 
{ 
    InitializeComponent(); 

    lvOnlineUsers.ItemsSource = _onlineUsers; 
} 

private ObservableCollection<OnlineUserList> _onlineUsers 
    = new ObservableCollection<OnlineUserList>(); 

public void AddUserToList(string username) 
{ 
    _onlineUsers.Add(new OnlineUserList { Name = username, Color = "Black" }); 
} 


public void RemoveUserFromList(string username) 
{ 
    // We don't search _onlineUsers for the string username, because 
    // _onlineUsers doesn't contain strings. It contains your user class. 
    // So instead, we look for the user class instance that has the name 
    // we want. 
    var found = _onlineUsers.FirstOrDefault(ou => ou.Name == username); 

    if (found != null) 
    { 
     _onlineUsers.Remove(found); 
    } 
} 
+0

Спасибо Эд, я буду смотреть в код –

+1

Эд, ты гений. Он работает так, как ожидалось. Я отмечаю это как ответ. Спасибо в миллион раз –

0

Пока вы не смотрели в MVVM, попробуйте следующее:

for(int i = lvOnlineUsers.Items.Count - 1; i >= 0; --i) 
{ 
    OnlineUserList item = lvOnlineUsers.Items[i] as OnlineUserList; 
    if (item != null && item.Name == username) 
     lvOnlineUsers.Items.Remove(lvOnlineUsers.Items[i]); 
} 
Смежные вопросы