Xamarin Forms MVVM iOS ListView не отображается; в SelectedItem есть данные

#xamarin #xamarin.forms #mvvm #xamarin.ios

#xamarin #xamarin.forms #mvvm #xamarin.ios

Вопрос:

Я последовал этому примеру https://medium.com/swlh/xamarin-forms-mvvm-how-to-work-with-sqlite-db-c-xaml-26fcae303edd

Я ввел точку останова в свой обработчик событий OnRouteSelected, и e.SelectedItem имеет выбранный объект, хотя ListView его не отображает.

Я что-то упускаю из виду ниже?

Вот мой код: RoutesPage.xaml

 <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"> 
       
    <ContentPage.Content>
            <ListView ItemsSource="{Binding Routes}" SelectedItem="{Binding SelectedRoute, Mode=TwoWay}" HasUnevenRows="False" SeparatorColor="Gray" ItemSelected="OnRouteSelected">
        <ListView.ItemTemplate>
            <DataTemplate>
              <ViewCell> 
                <ViewCell.View>
                    <Label TextColor="Black" Text="{Binding ROName}"/>
                </ViewCell.View>
            </ViewCell>
      </DataTemplate>

        </ListView.ItemTemplate>
    </ListView>
    </ContentPage.Content>
</ContentPage>
  

RoutesPage.xaml.cs

 public partial class RoutesPage : ContentPage
    {
        public RoutesPage()
        {
            InitializeComponent();

            var routeStore = new RouteStore(DependencyService.Get<ISQLiteDb>());
            var pageService = new PageService();
            ViewModel = new RoutesPageViewModel(routeStore, pageService);
        }
        protected override void OnAppearing()
        {
            base.OnAppearing();
            ViewModel.LoadDataCommand.Execute(null);

        }

        void OnRouteSelected(object sender, SelectedItemChangedEventArgs e)
        {
            ViewModel.SelectRouteCommand.Execute(e.SelectedItem);
        }
        public RoutesPageViewModel ViewModel
        {
            get { return BindingContext as RoutesPageViewModel; }
            set { BindingContext = value; }
        }
    }
  

RoutesPageViewModel.cs Метод loadData() получает данные и успешно добавляет их в коллекцию маршрутов.

 public class RoutesPageViewModel : BaseViewModel
    {
        private RouteViewModel _selectedRoute;
        private IRouteStore _routeStore;
        private IPageService _pageService;

        private bool _isDataLoaded;

        public ObservableCollection<RouteViewModel> Routes { get; private set; }
            = new ObservableCollection<RouteViewModel>();

        public RouteViewModel SelectedRoute
        {
            get { return _selectedRoute; }
            set { SetValue(ref _selectedRoute, value); }
        }

        public ICommand LoadDataCommand { get; private set; }
        public ICommand AddRouteCommand { get; private set; }
        public ICommand SelectRouteCommand { get; private set; }
        public ICommand DeleteRouteCommand { get; private set; }
        public ICommand CallRouteCommand { get; private set; }

        public RoutesPageViewModel(IRouteStore routeStore, IPageService pageService)
        {
            _routeStore = routeStore;
            _pageService = pageService;

            LoadDataCommand = new Command(async () => await LoadData());
            AddRouteCommand = new Command(async () => await AddRoute());
            SelectRouteCommand = new Command<RouteViewModel>(async c => await SelectRoute(c));
        }

        private async Task LoadData()
        {
            if (_isDataLoaded)
                return;

            _isDataLoaded = true;
            var routes = await _routeStore.GetRoutesAsync();
            foreach (var route in routes)
                Routes.Add(new RouteViewModel(route));
        }

        private async Task AddRoute()
        {
           // await _pageService.PushAsync(new RoutesDetailPage(new RouteViewModel()));
        }

        private async Task SelectRoute(RouteViewModel route)
        {
            if (route == null)
                return;

            SelectedRoute = null;
           // await _pageService.PushAsync(new RoutesDetailPage(route));
        }

    }
  

Свойство в viewmodels устанавливается следующим образом:
частная строка _roName;

     public string ROName
    {
        get { return _roName; }
        set
        {
            SetValue(ref _roName, value);
            OnPropertyChanged(nameof(ROName));
        }
    }
  

Конструктор:

 public RouteViewModel(Route route)
{
           //other properties 
   ROName = route.ROName;

}
  

При загрузке приложения.

Комментарии:

1. «ListView не отображает его». — что конкретно вы имеете в виду? Вы имели в виду, что выбранный элемент не выделен? Или что SelectedItem вообще не отображается?

2. Я добавил скриншот. Все строки пусты. Однако, если я выберу один, данные будут доступны в исходном коде. Я хочу, чтобы отображалось связанное свойство ROName

3. есть ли RouteViewModel имя общедоступного свойства ROName ?

4. кроме того, создайте Label дочерний элемент ViewCell , вам не нужно ViewCell.View

5. свойства есть. Я добавил конструктор RouteViewModel / getter / setter для ROName .