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

问题描述 投票:0回答:1

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

以及为什么这种方式实际上立即更新我的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}">
c# wpf caliburn.micro
1个回答
0
投票

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

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

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

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

请注意,当您仅创建新的集合实例,而不向现有集合添加元素或从中删除元素时,既不需要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);
}

最后但并非最不重要的是,在ItemsSource绑定上设置UpdateSourceTriggerNotifyOnSourceUpdated是毫无意义的。这足够了:

<ItemsControl ItemsSource="{Binding Data}">
© www.soinside.com 2019 - 2024. All rights reserved.