2017-02-14 4 views
0

Ich bin auf der Suche nach einer Möglichkeit zu wissen, ob meine Listview einen Wert enthält. Unten ist mein Code.Finden Sie Artikel in Listview mit Gridview und 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" }); 
} 

Nun ist dies in dem Problem habe

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

Antwort

1

Sie sollten MVVM lernen.

In der Zwischenzeit legen Sie die Elemente in eine ObservableCollection und weisen Sie es der ItemsSource -Eigenschaft in Ihrem Codebehind zu. Danach wiederholen Sie nach mir: Berühren Sie niemals lvOnlineUsers.Items. Nie nie nie. Vergiss, dass es existiert. Alles, was Sie tun, interagieren Sie mit der ObservableCollection. Suche es, füge Objekte hinzu, entferne Objekte daraus. Die Benutzeroberfläche wird sich auf magische und mysteriöse Weise selbst aktualisieren.

Ich gehe davon aus, dass dies in MainWindow ist. Wenn dies in einer anderen Ansicht ist, wird der Konstruktor einen anderen Namen haben.

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

Dank Ed, werde ich Ihren Code –

+1

Ed schauen, sind Sie Genie. Es funktioniert wie erwartet. Ich habe dies als Antwort markiert. Danke in einer Million mal –

0

Bis Sie in MVVM ausgesehen haben, versuchen Sie dies:

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]); 
} 
Verwandte Themen