0

我有一个带有 2 列的列表框的 wpf 表单。

我使用此代码向列表框添加值:

playersOnlineList.Items.Add(new { Username = username, Status = "Lobby" });

我使用此代码从列表框中删除值:

playersOnlineList.Items.Remove(new { Username = username, Status = "Lobby" });

我的问题是如何更新用户名 = x 的“状态”的值?

谢谢

4

3 回答 3

0

您可能必须按照以下方式做一些事情:

    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;
        }
    }

除非我误解了您的问题,否则这应该可以解决您的问题。在这种情况下,重新分配应该可以很好地工作。

于 2013-02-21T12:51:32.517 回答
0

第二行将不起作用,因为您正在创建一个新对象,而不是传递要删除的现有对象。您应该创建一个具有 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);

要编辑用户,如果你有实例,只需更改属性,如果没有,根据用户名找到它并更改它。

于 2013-02-21T12:59:26.037 回答
0

问题是您使用的是匿名类型。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;
    }
}
于 2013-02-21T13:02:49.287 回答