Caliburn.Micro NotifyOfPropertyChange UI 更新的不同方式

Caliburn.Micro NotifyOfPropertyChange different way of UI Update

有人可以向我解释为什么当我通过 Caliburn.Micro 框架(按钮 x:Name="LoadView")手动重新激活我的视图时,ItemsControl 只更新我的 UI。

为什么这种方式实际上会立即更新我的 UI?

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

我理解错了什么? 编辑:

    private static BindableCollection<DataModel> _IDirectorys;

没有静态它根本不会更新。

    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}">

首先,非静态的支持字段 属性 不能是静态的。从 _IDirectorys 中删除 static 修饰符。

然后当您在 StartScan 中创建新集合时,将其分配给 属性,而不是支持字段。否则 NotifyOfPropertyChange 不会被调用。

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

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

请注意,当您只创建新的集合实例时,您既不需要 BindableCollection 也不需要 ObservableCollection,但从不添加或删除现有集合的元素to/from。

所以这也应该有效:

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);
}

最后但同样重要的是,在 ItemsSource 绑定上设置 UpdateSourceTriggerNotifyOnSourceUpdated 是没有意义的。这足够了:

<ItemsControl ItemsSource="{Binding Data}">