当可观察的收集更改时,组合框不会刷新



我有一个WPF桌面应用。

我有一个下拉框,其项目源设置为可观察的集合。

目的是显示用户列表。我在该表格上有一个按钮,可以删除所选用户。它将" Active"字段设置为" 0",其中" 1"未删除。

问题是,即使我可以看到可观察到的集合已减少1.但是从视觉上看,下拉列表显示了所有原始的用户状态。

这是我的XAML:

<ComboBox ItemsSource="{Binding Users}" DisplayMemberPath="Login" 
                 SelectedValue="{Binding SelectedManagerUser}"  />

这是它的VM位:

public ObservableCollection<UserRecord> Users
{
    get
    {
        return (from users in UserRecord.Get().Where(d => d.Active == 1)
                     select new UserRecord
                     {
                         FName = users.FName,
                         SName = users.SName,
                         UserRecordId = users.UserRecordId,
                         Login = users.Login,
                         IsAdmin = users.IsAdmin,
                         UserRef = users.UserRef,
                         Disabled = users.Disabled,
                         Branch = users.Branch,
                         Department = users.Department,
                         Position = users.Position,                                
                         Salt = users.Salt,
                     }).OrderBy(d => d.Login).ToList();
    }
    set {
        _Users =  value; RaisePropertyChanged(InformedWorkerCommon.Constants.VM_Users); }
}

我的poco/型号:

public class UserRecord
{
    public int UserRecordId { get; set; }
    public string FName { get; set; }
    public string SName { get; set; }
    public string Login { get; set; }
    public string Salt { get; set; }
    public int IsAdmin { get; set; }
    public string UserRef { get; set; }
    public int Disabled { get; set; }
    public string Branch { get; set; }
    public string Position { get; set; }
    public int Active { get; set; }
    public string Department { get; set; }
    public string ServerRef { get; set; }
    public DateTime ServerTS { get; set; }
}

这是将活动字段设置为'0'的代码:

我的测试涉及与2个用户进行预加载

private void DeleteUser()
{
    try
    {

此时,用户计数为2

        UserRecord.Save(new UserRecord()
                {
                    UserRef=UserRef,
                    Branch = Branch,
                    Department = Department,
                    Disabled = Disabled == true ? 1 : 0,
                    FName = FName,
                    IsAdmin = 0,
                    Login = Login,
                    Position = Position,
                    SName = SName,
                    Active = 0,                           
                });

此时,用户计数为1,但下拉列表仍然显示2个用户

                DisplayInfoMessage(Properties.Resources.Deleted);
            }
        }
    }
    catch (Exception ex)
    {
        //handle the error
    }
}

我对WPF是相对较新的,所以我可以在这里做一个正确的how叫?

您应该创建ObservableCollection的一个实例一个实例,然后从此实例中添加和删除项目。

您可以在视图模型的构造函数中创建集合,并将属性作为简单的自动插入式读取属性实现,例如:

public class ViewModel
{
    public ViewModel()
    {
        Users = new ObservableCollection<UserRecord>((from users in UserRecord.Get().Where(d => d.Active == 1)
                                                      select new UserRecord
                                                      {
                                                          FName = users.FName,
                                                          SName = users.SName,
                                                          UserRecordId = users.UserRecordId,
                                                          Login = users.Login,
                                                          IsAdmin = users.IsAdmin,
                                                          UserRef = users.UserRef,
                                                          Disabled = users.Disabled,
                                                          Branch = users.Branch,
                                                          Department = users.Department,
                                                          Position = users.Position,
                                                          Salt = users.Salt,
                                                      }).OrderBy(d => d.Login).ToList());
    }
    public ObservableCollection<UserRecord> Users { get; }
}

然后,当您从源集合中添加或删除项目时,与用户属性绑定的ComboBox将被更新。但是,每当源属性的GETER被称为

时,您都不应创建一个新的ObservableCollection。

最新更新