c# - 使用下载服务将 IsRefreshing 绑定(bind)到 IsBusy

标签 c# mvvm xamarin.forms

我的代码从我的 IIS 下载一个 XML 文件。 XML 被处理为绑定(bind)到我的 View XAML 代码的列表。
当我使用刷新命令刷新列表时,我想要 IsRefreshing在我的列表更新时命令为真。IsRefreshing以某种方式停留在 true而且我的列表也没有更新。

你能帮我吗?

这是我的代码:

// ViewModel
public class ProcessesPageViewModel : BaseViewModel
    {
        DownloadProcesses downloadProcesses;
        public Command LoadItemsCommand { get; set; }

        public ProcessesPageViewModel()
        {
            LoadItemsCommand = new Command(ExecuteLoadItemsCommand);
            CreateList();
        }
        void CreateList()
        {
            downloadProcesses = new DownloadProcesses();
            var allProcesses = downloadProcesses.DownloadXML();
            ProcessList = allProcesses.Processes;
        }
        void ExecuteLoadItemsCommand()
        {
            if (IsBusy)
                return;

            IsBusy = true;

            try
            {
                CreateList();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            finally
            {
                IsBusy = false;
            }
        }

        private Process[] _processList;
        public Process[] ProcessList
        {
            get => _processList;
            set => SetValue(ref _processList, value);
        }
    }
}


// Download Process
 public class DownloadProcesses : BaseViewModel
    {
        public ProcessQuery DownloadXML()
        {
            IsBusy = true;
            XmlSerializer serializer = new XmlSerializer(typeof(ProcessQuery));
            string xml;
            using (WebClient client = new WebClient())
            {
                xml = client.DownloadString("http://x.x.x.x/test.xml");
            }
            using (StringReader reader = new StringReader(xml))
            {
                IsBusy = false;
                return (ProcessQuery)serializer.Deserialize(reader);
            }
        }
    }



    // Xaml 
    <ListView x:Name="ProcessesListView"
                  ItemsSource="{Binding ProcessList}"
                  VerticalOptions="Center"
                  HasUnevenRows="True"
                  RefreshCommand="{Binding LoadItemsCommand}"
                  IsPullToRefreshEnabled="True"
                  ItemSelected="OnItemSelected">
                  IsRefreshing="{Binding IsBusy, Mode=TwoWay}"

最佳答案

这可能是您看到的事件顺序:

  • 您下拉列表开始刷新。
  • ListView 将 IsBusy 设置为 true,因为您已将其与 TwoWay 绑定(bind)(尚不清楚这是 ListView 的工作方式,但确实如此)
  • 列表调用在命令上执行。
  • 您的命令注意到 IsBusy 已经为真,因此它没有执行。

  • 尝试将 IsRefreshing 绑定(bind)模式设置为 OneWay 并查看是否可行(当然,请确保 IsBusy 正在引发 OnPropertyChanged 事件)。您还可以假设 IsBusy 在您的命令中为 true,并且仅在完成后将其设置为 false。

    如果您仍然遇到问题,请考虑为列表的 IsRefreshing 使用单独的属性,而不是使用现有的 IsBusy 属性。

    关于c# - 使用下载服务将 IsRefreshing 绑定(bind)到 IsBusy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53223071/

    相关文章:

    C# 播放 MPEG 音频文件

    C# .NET Rx-System.Reactive 在哪里?

    wpf - 在 WPF 中跨 ViewModel 共享模型的最佳/推荐方式是什么?

    c# - Xamarin.Forms MVVM 从 DISplayAlert 获得响应

    c# - Xamarin Forms - 使用自定义 map 渲染器在 map 上创建多个多边形

    c# - 在 .NET Core 项目中引用外部 DLL

    javascript - Browserify 和 ReactJs.Net 服务器端渲染

    .net - MVVM With EF, DataAccess 设计题

    xamarin - 为什么我的 StackLayout 内的文本不环绕?

    ios - Xamarin Forms iOS 启动屏幕图像位置