Caliburn.Micro NotifyOfPropertyChange другой способ обновления пользовательского интерфейса - PullRequest
0 голосов
/ 30 января 2020

Может кто-нибудь объяснить мне, почему ItemsControl обновляет мой пользовательский интерфейс только тогда, когда я повторно активирую свой вид вручную через Caliburn.Micro Framework (кнопка x: Name = "LoadView").

И почему этот способ фактически обновляет мой UI сразу?

 Data = new BindableCollection<DataModel>
        (await dataAccess.Starter(progress, cts.Token).ConfigureAwait(true));

что я не так понимаю? Изменить:

    private static BindableCollection<DataModel> _IDirectorys;

без учета c не обновляется вообще.

    private static BindableCollection<DataModel> _IDirectorys;

    public BindableCollection<DataModel> Data
    {
        get
        {
            return _IDirectorys;
        }
        set
        {
            _IDirectorys = value;
            NotifyOfPropertyChange(() => Data);
        }
    }


    public async Task StartScan()
    {
        DataAccess dataAccess = new DataAccess();

        _IDirectorys = new BindableCollection<DataModel>
            (await dataAccess.Starter(progress, cts.Token).ConfigureAwait(true));
    }


<ItemsControl ItemsSource="{Binding Data, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}">

1 Ответ

1 голос
/ 30 января 2020

Прежде всего, вспомогательное поле для не * stati c свойства не должно быть stati c. Удалите модификатор static из _IDirectorys.

Затем при создании новой коллекции в StartScan назначьте ее свойству, а не полю поддержки. В противном случае NotifyOfPropertyChange не вызывается.

public async Task StartScan()
{
    DataAccess dataAccess = new DataAccess();

    Data = new BindableCollection<DataModel>(await dataAccess.Starter(progress, cts.Token));
}

Обратите внимание, что вам не нужно ни BindableCollection, ни ObservableCollection, когда вы только создаете новые экземпляры коллекции, но никогда не добавляете и не удаляете элементы в / из существующей коллекции.

Так что это также должно работать:

private IEnumerable<DataModel> data;

public IEnumerable<DataModel> Data
{
    get => data;
    set
    {
        data = value;
        NotifyOfPropertyChange(() => Data);
    }
}

public async Task StartScan()
{
    DataAccess dataAccess = new DataAccess();

    Data = await dataAccess.Starter(progress, cts.Token);
}

Последнее, но не менее важное, установка UpdateSourceTrigger и NotifyOnSourceUpdated в привязке ItemsSource не имеет смысла. Этого достаточно:

<ItemsControl ItemsSource="{Binding Data}">
...