我无法将DataGrid绑定到ObservableCollection

时间:2014-04-14 22:55:48

标签: c# wpf mvvm

我无法理解这里发生了什么。我的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的工作!为什么!

3 个答案:

答案 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"); 
}

在您的更新中,绑定尚未触发(您在构造函数中设置),因此它获取正确的列表。但是,对列表的后续更改将不起作用。