我有一个 ListView ,它的 IsRefreshing 属性绑定(bind)回 View 模型的 IsBusy 属性;旁注我要采用 MVVM 方法。问题是,当 IsBusy 设置为 false 时,它永远不会删除 ListView 上的旋转圆圈,就好像属性永远不会改变一样。 IsBusy 属性设置如下:
public RelayCommand LoadItemsCommand
{
get
{
return _loadItemsCommand
?? (_loadItemsCommand = new RelayCommand(
() =>
{
SetItems();
}));
}
}
public async void SetItems()
{
try
{
IsBusy = true;
List<Item> getItems = await service.GetItems();
//SETTING LISTS
selectedItem = null;
searchString = string.Empty;
IsBusy = false;
}
catch (Exception a)
{
//log it
IsBusy = false;
}
}
Set() 函数在页面加载命令中被调用。最初,这个 try/catch block 在页面加载命令中,但由于 IsBusy 属性似乎从未阻止 ListView 显示旋转圆圈,因此尝试了此路由。我确实知道此 View 模型已正确连接到 View ,因为命令和其他属性确实可以正常工作。
private bool _IsBusy;
public bool IsBusy
{
get { return _IsBusy; }
set { Set("IsBusy", ref _IsBusy, value); }
}
那就是属性(property)。
<ListView ItemsSource="{Binding items}"
RefreshCommand="{Binding LoadItemsCommand}"
IsPullToRefreshEnabled="true"
SelectedItem="{Binding selectedItem}"
IsRefreshing="{Binding IsBusy}"
Style="{StaticResource listViewStyle}">
<!-- OTHER LISTVIEW STUFF -->
</ListView>
这就是 View
最佳答案
您还应该尽量避免使用 async void
除非它是事件处理程序。
您可以创建一个异步 RelayCommand
通过执行以下操作...
private Lazy<RelayCommand> _loadItemsCommand = new Lazy<RelayCommand>(() =>
new RelayCommand(async () => await SetItems())
);
public RelayCommand LoadItemsCommand
get {
return _loadItemsCommand.Value;
}
}
public async Task SetItems() {
try {
IsBusy = true; // On UI Thread
var getItems = await service.GetItems(); //asynchronous task on a background thread
//Back on the UI Thread
//SETTING LISTS
selectedItem = null;
searchString = string.Empty;
IsBusy = false; // On UI Thread
} catch (Exception a) {
//log it
IsBusy = false;
}
}
关于c# - 任务完成后永远不会更新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45506539/