Как скопировать список OberservableCollection в виде списка из элементов запроса API в новый список - PullRequest
0 голосов
/ 07 октября 2019

У меня проблемы с копированием данных из одной ObservableCollection в другую. У меня есть API-вызов GetItemsAsync из http, который помещает ответ в модель с именем ShipList.cs. Внутри ShipList.cs есть корабли ShipCatalog []. Я создал вторую модель под названием HangarList.cs с ангарами HangarCatalog []. У меня есть страница, которая отображает основной список кораблей (ShipsList). Я хочу, чтобы пользователь выбрал корабль (ShipList.name привязан к этому конкретному ListVIew. Я пытался использовать .Where () для фильтрации ShipList только для совпадения свыделенный элемент и скопировать эти данные в HangarCatalog. Я получаю Невозможно преобразовать GallogForms.Api.ShipCatalog в GallogForms.Api.HangarCatalog, используя следующий код: ViewModel


      private ShipCatalog _selectedShip;
       public ShipCatalog SelectedShip
        {
        get {return _selectedShip; }
    set
    {if (_selectedShip != value)
    _selectedShip = value;
    id = _selectedShip.id;
    CopyShipData();


    private async void CopyShipData()
            {
                var _container = Items.Where(s => 
        s.name.FirstOrDefault().ToString() == id.ToString()).ToList();
            foreach (var item in _container.Where(s => 
    s.name.FirstOrDefault().ToString() == id.ToString()).ToList())

              //  var items = await _gallogClient.GetItemsAsync<ShipList>();
             //   foreach (var item in items.ships.Where(s => 
      //  s.name.FirstOrDefault().ToString() == id.ToString()).ToList())
                {
                    Hangars.Clear();
                    Hangars.Add(item);
                }
            }

Я еще не нашел ответа,и я много читал, это может помочь в моей ситуации. myShipsList связан с новой моделью, которую я создал в API, которая идеально отражает ShipCatalog [].

Я также продолжаю сталкиваться с ответами, которые предлагаютListViewItem.Item или, в моем случае, AddedShipView.Items .Items не является опцией для моих ListViews в модели представления.

AddShipPage.xaml


    <StackLayout Orientation="Vertical">
            <SearchBar x:Name="HangarListView" Text="Add To Your Fleet!"
                       TextChanged="HangarList_TextChanged" 
                       BackgroundColor="Azure"
                       />
            <Grid>
                <ListView x:Name="SuggestedShipView" 
                          ItemsSource="{Binding Items}"
                          SelectedItem="{Binding selectedShip}"
                          BackgroundColor="Silver">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>

                  .....................

ShipList.cs (API Query)


    [ApiPath("ships")]
        public class ShipList : ApiQueryable
        {
            public ShipCatalog[] ships { get; set; }
        }
        public class ShipCatalog : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged; 
            protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }

            public int id { get; set; }
            public string name { get; set; }
            public string uri { get; set; }
            public int rsi_id { get; set; }
            public string img { get; set; }
            public string mfr { get; set; }
            public string flyable { get; set; }
            public string scu { get; set; }
            public string value { get; set; }
            public string bgcolor { get; set; }
            public string color { get; set; }
            public string role { get; set; }
            public bool _isVisible { get; set; }
            public bool IsVisible
            {
                get { return _isVisible; }
                set
                {
                    if (_isVisible != value)
                    {
                        _isVisible = value;
                        OnPropertyChanged();
                    }
                }
            }
        }

}

HangarList отлично отражает ShipList, за исключением того, что он называется HangarList, общедоступный ангарный каталог [] ангаров

And Finсоюзник, запрос, который заполняет ShipCatalog [] AddShipViewModel



      Items.Clear();
            var items = await _gallogClient.GetItemsAsync<ShipList>();
            foreach (var item in items.ships.ToList())
            {
                Items.Add(item);


      }

Нет сообщений об ошибках как таковых, но я не смог структурировать метод для выполнения этой задачи. Если вы хотите увидеть весь проект, чтобы увидеть больше того, что я делаю, http://github.com/dreamsforgotten/GallogMobile

1 Ответ

0 голосов
/ 07 октября 2019

при нажатии или выборе элемента в ListView второй параметр обработчика событий будет содержать ссылку на выбранный / выбранный элемент. Вам просто нужно привести его к правильному типу. Затем вы можете ссылаться на все его свойства по мере необходимости

private void SuggestedShipView_ItemTapped(object sender, ItemTappedEventArgs e)
{
  // e.Item is the specific item selected
  ShipCatalog ship = (ShipCatalog)e.Item;

  // you can then use this ship object as the data source for your Hangar list/control,
  // and/or add it to another List that is just the items the user has selected

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