使用下载服务将IsRefreshing绑定到IsBusy

时间:2018-11-09 09:32:53

标签: c# mvvm xamarin.forms

我的代码从IIS下载XML文件。 XML被处理为一个列表,该列表已绑定到我的View XAML代码。 当我使用refresh命令刷新列表时,我希望IsRefreshing命令在更新列表时为true。 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}"

1 个答案:

答案 0 :(得分:0)

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

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

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

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