我无法理解这里发生了什么。我的ViewModel中有两个公共属性:
public ObservableCollection<vw_ClientesFull> MyClients { get; set; }
private IEnumerable<vw_ClientesFull> _clients;
public IEnumerable<vw_ClientesFull> Clients
{
get
{
return _clients;
}
set
{
_clients= value;
OnPropertyChanged("Clients");
}
}
然后我有一个方法来刷新它们:
private void RefreshClientes()
{
this.serviceClient.Clientes_ListarCompleted += (s, e) =>
{
Clients = e.Result;
MyClients = new ObservableCollection<vw_ClientesFull>(Clients);
};
this.serviceClient.Clientes_ListarAsync(_sRazonSocial, VendedorSel, TransporteSel, _nID, bInactivos);
}
我绑定了我的dataGrid来显示信息。如果我这样做:
ItemsSource="{Binding Path=Clients}"
如果工作完美,但如果我做的话:
ItemsSource="{Binding Path=MyClients}"
什么都没有显示!为什么? ObservableCollection不会自动激活onPropertyChange吗?
感谢您的帮助!!!
更新
因此,如果我需要手动触发OnPropertyChange,为什么没有它就可以工作呢?
public ObservableCollection<Vendedores> Vendedores { get; set; }
private void CargarVendedores()
{
Vendedores = new ObservableCollection<Vendedores>(this.serviceClient.GetVendedores());
this.VendedorSel = this.Vendedores.FirstOrDefault();
}
如果我绑这样的组合框:
ItemsSource="{Binding Path=Vendedores}"
没有OnPropertyChange的工作!为什么!
答案 0 :(得分:2)
这个问题是由于误解造成的。当您替换它时,ObservableCollection 不引发PropertyChanged(在重新分配整个属性时发生),而是CollectionChanged(在添加或删除项时引发)。如果您打算重新分配整个对象,则仍需要引发PropertyChanged。
答案 1 :(得分:1)
设置PropertyChanged
的值时,必须提升MyClients
事件,与Clients
已完成相同。
答案 2 :(得分:1)
是的,ObservableCollection实现了INotifyPropretyChanged。但是,它不会在这里帮助你:))
ObservableCollection很特殊,因为它实现了INotifyCollectionChanged
。换句话说,它会在将项目添加到基础集合或从基础集合中删除时引发事件。它还实现了INotifyPropertyChanged,因此绑定到集合属性的任何内容都将得到更新。
您正在更改变量本身(设置为新实例不少)。这要求ObservableCollection 属性的“实例”引发事件。换句话说,你需要:
private ObservableCollection<vw_ClientesFull> myClients;
public ObservableCollection<vw_ClientesFull> MyClients
{
get { return myClients; }
set
{
myClients = value;
OnPropertyChanged("MyClients");
}
在您的更新中,绑定尚未触发(您在构造函数中设置),因此它获取正确的列表。但是,对列表的后续更改将不起作用。