c# - 任务完成后永远不会更新属性

标签 c# listview xamarin mvvm

我有一个 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/

相关文章:

android - ListView的getFirstVisiblePosition和getLastVisiblePosition是骗人的吗?

azure - Xamarin.Mac Azure 通知中心

c# - Xamarin 中的跨平台 OpenGL 渲染

c# - 如何在不中断用户体验的情况下在后台轮询 webapi 请求?

c# - 从 c sharp 客户端应用程序上传到 PHP 服务器

c# - 发现多个与请求 :*** 匹配的操作

c# - 在 .NET 中将多个非 SELECT MySQL 语句作为单个命令文本执行

c# - 使用紧凑的 Framework 3.5 样式化 ListView 控件

android - setOnItemClickListener 不适用于 Fragment

firebase - React-native ListView排序数据