为什么ObservableCollection无法更新UI数据网格?

时间:2019-07-03 12:51:57

标签: c# wpf mvvm mvvm-light observablecollection

我正在尝试在我的应用中显示客户。我已将WPF与MVVM Light一起使用。 当我将视图切换到客户时,我的数据网格为空。为什么不加载?

我的ShellViewModel继承自BaseViewModel。

我正在将用户从MainViewModel发送到我的ClientsViewModel。

ClientsViewModel:

public class ClientsViewModel : ShellViewModel
{
    public ObservableCollection<Customer> Customers { get; set; }

    public Customer customer { get; set; }

    public ClientsViewModel()
    {
        SetView("Klienci");
        Messenger.Default.Register<UserMessage>(this, (message) =>
        {
            try { User = message.User;
                GetCustomers();
            }
            catch (System.InvalidOperationException e) { }
        });

    }

    private void GetCustomers()
    {
        Customers = new ObservableCollection<Customer>();

        using (var context = new mainEntities())
        {
            var result = context.customerassigned.Where(c => c.user_id == User.Id).Include(c => c.customer).Where(c=>c.customer.status_id == 1);
            foreach (var item in result)
            {
                Customers.Add(new Customer(item.customer.id, item.customer.name, item.customer.status_id));
            }

        }
    }
}

GetCustomers()方法工作正常。 我在ClientsView中的数据网格:

<DataGrid Name="grdCustomers" SelectedItem="{Binding ClientsView.customer}" ItemsSource="{Binding ClientsView.Customers, Mode=OneWay}" AutoGenerateColumns="true" Height="500"></DataGrid>

我应该改变什么?

2 个答案:

答案 0 :(得分:0)

我尝试过这样的事情:

private ObservableCollection<Customer> customers;
    public ObservableCollection<Customer> Customers
    {
        get
        {
            return customers;
        }
        set
        {
            if (customers == value)
                return;
            customers = value;
            RaisePropertyChanged("Customers");
        }
   }

但是它也不起作用。

如果我返回main并再次访问客户,则客户处于datagrid中。 简单:

public ObservableCollection<Customer> Customers { get; set; }

工作原理相同

答案 1 :(得分:0)

不要创建新的ObservableCollection实例,只需创建一次并根据需要填充它即可。

public ObservableCollection<Customer> Customers { get; } = new ObservableCollection<Customer>();

...

private void GetCustomers()
{
    Customers.Clear();

    using (var context = new mainEntities())
    {
        var result = context.customerassigned.Where(c => c.user_id == User.Id).Include(c => c.customer).Where(c=>c.customer.status_id == 1);
        foreach (var item in result)
        {
            Customers.Add(new Customer(item.customer.id, item.customer.name, item.customer.status_id));
        }

    }
}

还要注意上面的Clemens评论。

您需要

1)创建一个ClientsViewModel实例,并将其分配给View的DataContext。

2)在此情况下,仅绑定到ClientsViewModel类的公共属性-ItemsSouce ==>客户,而不是ClientsView.Customers。