2017-02-14 72 views
0

我正在尋找一種方法來知道我的listview是否包含一個值。以下是我的代碼。在GridView和WPF中查找listview項目

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中,並將其分配給代碼隱藏中的listview的ItemsSource屬性。此後,請重複我:永遠不要觸碰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]); 
}