Как перезагрузить UWP DataGrid при изменении ItemSource - PullRequest
0 голосов
/ 21 октября 2019

UWP DataGrid: ссылка

Вот xaml:

<controls:DataGrid x:Name="dg_Users"
            AlternatingRowBackground="Gainsboro"
            AutoGenerateColumns="False"
            BorderThickness="1"
            CanUserResizeColumns="False"
            GridLinesVisibility="Horizontal"
            IsReadOnly="True"                
            ItemsSource="{Binding UserSource, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">

Связанное свойство:

private ObservableCollection<User> _userSource;
    public ObservableCollection<User> UserSource {
        get { return _userSource; }
        set { SetProperty(ref _userSource, value); }
    }

Метод:

//called on constructor
private async void LoadData() {
        UserSource = new ObservableCollection<User>();
        var users = await sqlService.AllUsers();

        if(users != null) {
            foreach (var item in users) {
                UserSource.Add(item);
            }
        }
    }

В таблице данных будет отображаться, например, 3 элемента, затем я внес некоторые изменения, например, добавил новый элемент или удалил 1 элемент. Когда я нажимаю кнопку, вызывающую LoadData (), пользовательский источникбыл изменен и содержит новые данные, но сетка данных не перезагружается и не показывает новые / обновленные данные. Как я могу перезагрузить DataGrid через mvvm?

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Как перезагрузить UWP DataGrid при изменении ItemSource

Пожалуйста, избегайте повторного создания нового ObservableCollection при каждом нажатии кнопки. пожалуйста, реализуйте объект ObservableCollection один раз, затем отредактируйте его. Пожалуйста, проверьте следующий код.

public class MainPageViewModel
{
    public ObservableCollection<User> UserSource { get; } = new ObservableCollection<User>();     

    public MainPageViewModel()
    {
        LoadData();        
    }

    private async void LoadData()
    {
        UserSource.Clear();

        var users = await sqlService.AllUsers();

        if (users != null)
        {
            foreach (var item in users)
            {
                UserSource.Add(item);
            }
        }
    }

    public ICommand BtnClickCommand
    {
        get
        {
            return new RelayCommand(() =>
            {
                UserSource.RemoveAt(0);
            });
        }
    }

}
0 голосов
/ 22 октября 2019

Самое простое решение:

изменило свойство на IEnumerable, так как мои функции AllUsers возвращают IEnumerable:

private IEnumerable<User> _userSource;
    public IEnumerable<User> UserSource {
        get { return _userSource; }
        set { SetProperty(ref _userSource, value); }
    }

Затем в LoadData:

private async void LoadUserData() {
        UserSource = await sqlService.AllUsers();
    }

Благодаря @Clemens

...