我有一个wpf桌面应用程序。
我有一个下拉框,其项目源设置为可观察的集合。
目的是显示用户列表。 我在该表单上有一个按钮,将删除所选用户。 它设置了“活跃”字段。到' 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; }
}
这是将活动字段设置为&#39; 0&#39;:
的代码我的测试涉及预装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相对较新,所以我可以在这里做一个正确的咆哮?
答案 0 :(得分:1)
您应该创建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; }
}
然后,当您从源集合中添加或删除项目时,绑定到Users属性的ComboBox将更新。但是每次调用source属性的getter时都不应该创建一个新的ObservableCollection。