Привязка IsRefreshing к IsBusy с помощью службы загрузки - PullRequest
0 голосов
/ 09 ноября 2018

Мой код загружает файл XML из моей IIS. XML обрабатывается в список, который привязан к моему коду View XAML. Когда я обновляю свой список с помощью команды refresh, я хочу, чтобы команда 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 Ответ

0 голосов
/ 09 ноября 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...