Связывание IsRefreshing с IsBusy с сервисом загрузки

Мой код загружает XML-файл из моего IIS. XML обрабатывается в список, привязанный к моему коду 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}"

Всего 1 ответ


Вероятно, это порядок событий, которые вы видите:

  1. Вы спускаете список, чтобы начать освежиться.
  2. Listview SETS IsBusy - true, потому что вы связали его с TwoWay (непонятно, как работает listview, но это так)
  3. Список вызывает выполнение команды.
  4. Ваша команда замечает, что IsBusy уже прав, поэтому он не выполняется.

Попробуйте установить режим привязки IsRefreshing к OneWay и посмотрите, работает ли это (убедитесь, что IsBusy поднимает события OnPropertyChanged). Вы также можете предположить, что IsBusy будет истинным в вашей команде и будет устанавливать значение false только тогда, когда это будет сделано.

Если у вас все еще есть проблемы, учитывая использование отдельного свойства для IsRefreshing в списке, вместо использования вашего существующего свойства IsBusy.


Есть идеи?

10000