Отображение одного значения из вызова API TextBlock (MVVM) - PullRequest
0 голосов
/ 17 февраля 2020

Я застрял на этом несколько часов. Я использую IGDB API для приложения, которое я создаю. Итак, я пытаюсь получить ListBox, чтобы показать название игры, обложку и разработчика. Мне удалось сделать так, чтобы все они отображались в списке без проблем, но главная проблема возникает тогда, когда я просто хочу показать одного разработчика в списке, список показывает все вовлеченные компании плюс разработчика, потому что API возвращает массив вовлеченных компаний, и внутри этих вовлеченных компаний тело разработчика возвращает логическое значение, чтобы указать, какой из них является разработчиком. Я могу видеть это в своей голове, если разработчик верен, тогда покажите разработчику и удалите другие вовлеченные компании. Вот изображение того, что появляется, когда я запускаю свой запрос:

Изображение запроса

Я выделил его красным. Из этого списка все, что мне нужно, это Bung ie, так как они разработчики. Так что, на мой взгляд, у меня есть ListBox и вложенный в него ListView:

BrowseGamesView

<ListBox ItemsSource="{Binding Games}"
             Width="390"
             Height="500"
             Grid.Row="4">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <Border Grid.Column="0"
                            Grid.Row="0"
                            Grid.RowSpan="2"
                            Margin="0 0 10 0">
                        <Image Source="{Binding cover.image_id, Converter={StaticResource stringToImage}}"
                               Stretch="Fill"
                               Height="70"
                               Width="60"/>
                    </Border>
                    <TextBlock Text="{Binding name}"
                               FontWeight="Bold"
                               Grid.Column="1"
                               Grid.Row="0"/>
                    <ListView Grid.Column="1"
                              Grid.Row="1"
                              ItemsSource="{Binding involved_companies}">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding company.name}"/>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

В моей ViewModel у меня есть метод для создания запроса, а также содержит коллекцию ObservableCollection (Games).

BrowseGamesViewModel

public ObservableCollection<Game> Games { get; set; }

public async void MakeQuery()
        {
            var games = await IGDBHelper.GetGames(Query);

            Games.Clear();
            foreach(var game in games)
            {
                Games.Add(game);
            }
        }

В моем классе Helper я получаю игры

IGDBHelper

public static async Task<List<Game>> GetGames(string query)
        {
            List<Game> games = new List<Game>();

            string myJson = "search \"{0}\"; fields name, cover.url, cover.image_id, involved_companies.developer, involved_companies.company.name; limit 500;";

            using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("user-key", "key hidden");

                var response = await client.PostAsync(BASE_URL_GAMES, new StringContent(string.Format(myJson, query), Encoding.UTF8, "application/json"));

                var responseString = await response.Content.ReadAsStringAsync();

                games = JsonConvert.DeserializeObject<List<Game>>(responseString);
            }

            return games;
        }

И все модели являются конкретными классами для Json

public class Game
    {
        public int id { get; set; }
        public Cover cover { get; set; }
        public List<InvolvedCompany> involved_companies { get; set; }
        public string name { get; set; }
    }


public class InvolvedCompany
    {
        public int id { get; set; }
        public Company company { get; set; }
        public bool developer { get; set; }
    }

public class Company
    {
        public int id { get; set; }
        public string name { get; set; }
    }

public class Cover
{
    public int id { get; set; }
    public string image_id { get; set; }
    public string url { get; set; }
}

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

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Я бы добавил новое свойство только для чтения в класс Game:

public List<InvolvedCompany> DeveloperCompanies 
{ 
    get 
    { 
        return involved_companies.Where(c => c.developer == true).ToList();  
    } 
}

И затем вы можете привязать это новое свойство к своему ListView:

<ListView Grid.Column="1"
          Grid.Row="1"
          ItemsSource="{Binding DeveloperCompanies}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding company.name}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Таким образом, вы будет показывать только компании-разработчики, но вы также будете хранить информацию обо всех участвующих компаниях, если вам понадобится использовать их для других целей.

Я также предлагаю вам использовать PascalCase для публикации c Члены класса. Так, например, involved_companies станет InvolvedCompanies.

0 голосов
/ 17 февраля 2020

Во-первых, я бы предложил назвать ваши свойства в PascalCase. Теперь для вашей проблемы, я предлагаю отфильтровать компании по свойствам разработчика и назначить новый список вовлеченных компаний в игру, прежде чем добавлять его в список.

foreach(var game in games)
  {
     game.involved_companies = game.involved_companies.Where(e => e.developer == true).Tolist();
     Games.Add(game);
  }

Не проверено, но я считаю, что это должно работать.

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