有人可以向我解释为什么当我通过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}">
首先,非静态属性的支持字段不得为静态。从_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绑定上设置UpdateSourceTrigger
和NotifyOnSourceUpdated
是毫无意义的。这足够了:
<ItemsControl ItemsSource="{Binding Data}">