Почему ObservableCollection не обновляет сетку данных пользовательского интерфейса? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь отобразить клиентов в моем приложении.Я использовал WPF с MVVM Light.Когда я переключаю представление на Customer, у меня есть пустая сетка данных.Почему не загружается?

Моя ShellViewModel наследует от BaseViewModel.

Я отправляю пользователя на мою ClientsViewModel из MainViewModel.

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 голосов
/ 03 июля 2019

Не создавайте новый экземпляр 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));
        }

    }
}

Также обратите внимание на комментарии Клеменса выше.

Вам нужно

1) Создайте экземпляр ClientsViewModel и назначьте его для DataContext вашего View.

2) Связывать только с общими свойствами класса ClientsViewModel - ItemsSouce ==> Клиенты в данном случае, а не ClientsView.Customers, что бы это ни было.

0 голосов
/ 03 июля 2019

Я пробовал что-то вроде этого:

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

но это тоже не работает.

Если я вернусь к основному и снова пойду к потребителям, клиенты будут в сетке данных. С простым:

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

Работает так же

...