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 绑定上设置 UpdateSourceTrigger
和 NotifyOnSourceUpdated
是没有意义的。这足够了:
<ItemsControl ItemsSource="{Binding Data}">
有人可以向我解释为什么当我通过 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 绑定上设置 UpdateSourceTrigger
和 NotifyOnSourceUpdated
是没有意义的。这足够了:
<ItemsControl ItemsSource="{Binding Data}">