繁体   English   中英

我无法将DataGrid绑定到ObservableCollection

[英]I can't binding DataGrid to ObservableCollection

我不明白这里发生了什么。 我的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即可工作! 为什么!

此问题是由于误解造成的。 的ObservableCollection 提高的PropertyChanged,当你更换(当整个财产被重新分配它发生的),而是CollectionChanged(在将项目添加或删除其升高)。 如果您打算重新分配整个对象,则仍然需要提高PropertyChanged。

设置MyClients的值时必须引发PropertyChanged事件,这与对Clients所做的相同。

是的,ObservableCollection实现了INotifyPropretyChanged。 但是,它不会在这里帮助您:)

ObservableCollection很特别,因为它实现了INotifyCollectionChanged 换句话说,当将项目添加到基础集合或从基础集合中删除时,它引发一个事件。 它还实现了INotifyPropertyChanged,因此绑定到集合属性的所有内容都将得到更新。

不过,您正在更改变量本身(至少设置为一个新实例)。 这要求ObservableCollection 属性的“实例”引发事件。 换句话说,您需要:

private ObservableCollection<vw_ClientesFull> myClients;
public ObservableCollection<vw_ClientesFull> MyClients 
{ 
    get { return myClients; }
    set
    {
       myClients = value;
       OnPropertyChanged("MyClients"); 
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM