我有一个带有 2 列的列表框的 wpf 表单。
我使用此代码向列表框添加值:
playersOnlineList.Items.Add(new { Username = username, Status = "Lobby" });
我使用此代码从列表框中删除值:
playersOnlineList.Items.Remove(new { Username = username, Status = "Lobby" });
我的问题是如何更新用户名 = x 的“状态”的值?
谢谢
我有一个带有 2 列的列表框的 wpf 表单。
我使用此代码向列表框添加值:
playersOnlineList.Items.Add(new { Username = username, Status = "Lobby" });
我使用此代码从列表框中删除值:
playersOnlineList.Items.Remove(new { Username = username, Status = "Lobby" });
我的问题是如何更新用户名 = x 的“状态”的值?
谢谢
您可能必须按照以下方式做一些事情:
for (int i = 0; i < playersOnlineList.Items.Count; i++) {
if (playersOnlineList.Items[i].Username == x) {
Player p = playersOnlineList.Items[i];
p.Status = newStatus;
playersOnlineList.Items[i] = p;
}
}
除非我误解了您的问题,否则这应该可以解决您的问题。在这种情况下,重新分配应该可以很好地工作。
第二行将不起作用,因为您正在创建一个新对象,而不是传递要删除的现有对象。您应该创建一个具有 Username 和 Status 属性的类,然后填充ListBoxusing ItemsSource:
User user = new User(); //your custom class
user.Username = username;
user.Status = "Lobby";
List<User> source = new List<User>();
source.Add(user);
//add more users here
listBox.ItemsSource = source;
//removing a user
source.Remove(user);//if you have the instance
//if not, find user by username and remove it
User userToRemove = null;
foreach (User user in source) {
if (user.Username == "myUserName") {
userToRemove = user;
break;
}
}
if(userToRemove != null)
source.Remove(userToRemove);
要编辑用户,如果你有实例,只需更改属性,如果没有,根据用户名找到它并更改它。
问题是您使用的是匿名类型。Items列表框集合返回的项目以object. 为了访问项目的属性,您需要强制转换它们,因为类型是匿名的,所以您不能这样做。为您的项目创建一个明确的类。
class UserStatus
{
public string Username { get; set; }
public string Status { get; set; }
public override bool Equals(object obj)
{
UserStatus other = obj as UserStatus;
return other != null && other.Username == Username && other.Status == Status;
}
public override int GetHashCode()
{
unchecked {
int hash = 17;
hash = hash * 31 + Username == null ? 0 : Username.GetHashCode();
hash = hash * 31 + Status == null ? 0 : Status.GetHashCode();
return hash;
}
}
}
现在您可以搜索项目的索引
for (int i = 0; i < playersOnlineList.Items.Count; i++) {
var userStatus = (UserStatus)playersOnlineList.Items[i];
if (userStatus.Username == x) {
userStatus.Status = newStatus;
break;
}
}