Wyświetlenie losowej wartości JSON w MAUI Community Toolkit Popup

0

Stworzyłem kod który wybiera losową wartość JSON. W jaki sposób mogę wyświetlić wybraną wartość JSON w popupie? Próbowałem poprzez Data Binding ale niestety nie wiem jak to zrobić.
Kod wyboru losowej wartości JSON:

public MainPage()
    {
        InitializeComponent();
        this.BindingContext = new MainPageViewModel();

    }

    
    
    private async void OnButton_Clicked1(object sender, EventArgs e)
    {
        Random random = new Random();
        int randomdrink = random.Next(1, 5);
        using var stream = await FileSystem.OpenAppPackageFileAsync("drinks.json");
        using var reader = new StreamReader(stream);
        var drinks = JsonSerializer.Deserialize<List<drinksclass>>(stream);
        if (drinks != null)
        {
            foreach (var drinksclass in drinks)
            {
                if (drinksclass.id == randomdrink)
                {
                    //await DisplayAlert($"ALERT", drinksclass.name, "OK");
                    //this.ShowPopup(new PopupPageAlert(drinksclass));

                }
            }
        }
    }

Kod Popup:

public partial class PopupPageAlert : Popup
{
    public drinksclass drink { get; set; }
    public PopupPageAlert(drinksclass drink)
    {
        InitializeComponent();
        this.drink = drink;
    }
    public PopupPageAlert()
	{
        InitializeComponent();
		this.BindingContext = this.drink = drink;
        
	}
    private void CloseBtn_Clicked(object sender, EventArgs e)
    {
        this.Close();
    }
}

Klasa:

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

JSON:

[
  
  {
     "name": "Sex On The Beach",
     "id": 1
  },
  {
     "name": "Pina Colada",
     "id": 2
  },
  {
    "name": "Mojito",
    "id": 3

  },
  {
    "name": "Cuba Libre",
    "id": 4
  }
  
]
0

Czy jesteś pewien że Id tych drinków są w zakresie 1..5?

0

@_13th_Dragon:

_13th_Dragon napisał(a):

Czy jesteś pewien że Id tych drinków są w zakresie 1..5?

Zakres (1.5) odpowiada zakresowi od 1 do 4.
Tylko 4 bo tyle jest dodanych w JSON.

0

Czy ty nie mylisz .id z numerem w tablice?
Tak a propos random.Next(1, 5); daje wynik w zakresie 1..5

0
_13th_Dragon napisał(a):

Czy jesteś pewien że Id tych drinków są w zakresie 1..5?

Zakres (1.5) odpowiada zakresowi od 1 do 4

@_13th_Dragon:

_13th_Dragon napisał(a):

Czy ty nie mylisz .id z numerem w tablice?
Tak a propos random.Next(1, 5); daje wynik w zakresie 1..5

Co do zakresu niestety się mylisz.
Cały kod zwraca mi poprawne wartości.
Treścią posta nie jest niedziałająca konstrukcja a sposób w jaki mogę wybraną wylosowaną wartość z JSON wyświetlić w popupie.

0
LilyAngel napisał(a):

Zakres (1.5) odpowiada zakresowi od 1 do 4

Skoro to JSON o określonym rozmiarze to czemu nie dasz go wprost jako tablicę w kodzie?
Jeżeli nie jest to pobieraj rozmiar po wczytaniu JSONa a potem dopiero losuj.
Podaj tego JSONa tu.

Pierwszy konstruktor PopupPageAlert, którego używasz nie inicjalizuje BindingContext;
Drugi konstruktor PopupPageAlert, którego nie używasz inicjalizuje BindingContext pustym drink;

public partial class PopupPageAlert : Popup
{
    public drinksclass drink { get; set; }
    public PopupPageAlert(drinksclass drink)
    {
        InitializeComponent();
        this.BindingContext = this.drink = drink;
    }
    private void CloseBtn_Clicked(object sender, EventArgs e)
    {
        this.Close();
    }
}
        Random random = new Random();
        using var stream = await FileSystem.OpenAppPackageFileAsync("drinks.json");
        using var reader = new StreamReader(stream);
        var drinks = JsonSerializer.Deserialize<List<drinksclass>>(stream);
        drinksclass drink=drinks[random.Next(drinks.Count)];
0

@LilyAngel:

Dziel problemy na podproblemy, bo nigdy nie wyjdziesz na prostą
Schemat przypadkowy, bo nie do końca rozumiem W CZYM problem. Chyba w pierwszej połowie podstawówki jest podział planu wypracowania na punkty.

produkcja JSON (tu chyba ręcznie)

konsumpcja

  • pobranie (jaki nośnik - tu plik)
  • parsowanie i odłożenie wyniku w jakiś zmiennych itd...
  • wykorzystanie uzyskanych zmiennych (prezentacja)

Zależnie z czym jest kłopot, pozostałe pozostawiasz poza umysłem. Miau tulkit nie ma znaczenia dla losowania, i na odwrót itp
Można testować fragmenty, idąc od przodu czy od tyłu (np sztucznie zainicjowaną zmienną wyświetlić, nie majac początkowych etapów)

0

@ZrobieDobrze: Jedyne co chce zrobić to przedstawić wylosowaną wartość na popupie. Nigdzie nie napisalem ze potrzebuje pomocy z deserializacją, generowaniem losowej wartości czy jakiejkolwiek innej rzeczy.

0
LilyAngel napisał(a):

@ZrobieDobrze: Jedyne co chce zrobić to przedstawić wylosowaną wartość na popupie. Nigdzie nie napisalem ze potrzebuje pomocy z deserializacją, generowaniem losowej wartości czy jakiejkolwiek innej rzeczy.

Na takie fora się przygotowuje SELEKTYWNY kod
A nawet to co piszesz, dzieli sie na dwa

  • wylosowaną
  • przedstawić wartość
0

@ZrobieDobrze: Wolę przedstawić większy zakres kodu żeby osoba czytająca miała rozeznanie co i jak.

2

Kod twojego popupa nie ma sensu.

Raczej coś takiego:

public partial class PopupPageAlert : Popup
{
    public drinksclass drink { get; set; }
    public PopupPageAlert(drinksclass drink)
    {
        InitializeComponent();
        this.drink = drink;
   		this.BindingContext = this.drink;
    }

    private void CloseBtn_Clicked(object sender, EventArgs e)
    {
        this.Close();
    }
}

Reszta kodu wygląda w porządku, aczkolwiek zamiast tego foreacha i ifa wystarczy coś takiego:

this.ShowPopup(new PopupPageAlert(drinks.First(x => x.id == randomdrink)));

A jeżeli się nie pokazuje poprawnie to ewentualnie pokaż jeszcze XAML do swojego popupa.

0

@Ktos: Wrócę z pracy, sprawdzę i dam znać.

0

@Ktos: niestety cos nie chce wyświetlać :/
Kod XAML:

<toolkit:Popup xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
               CanBeDismissedByTappingOutsideOfPopup="True"
               HorizontalOptions="Center"
               VerticalOptions="Center"
               Color="Coral"
               
             x:Class="AAA.PopupPageAlert" >
    <Frame BorderColor ="Coral" BackgroundColor="Coral" >
        <VerticalStackLayout Spacing="5" BackgroundColor="Coral" >
            <Label Text="WYLOSOWANY DRINK!" FontSize="22" FontAttributes="Bold" FontFamily="Almarai-ExtraBold" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" />
            <Image Source="pinacolada.png" WidthRequest="200" HeightRequest="200" HorizontalOptions="Center" VerticalOptions="Center" />
            <Label Text="{Binding drink}" />
            <HorizontalStackLayout>
                <Button Text="ZAMKNIJ" x:Name="CloseBtn" Clicked="CloseBtn_Clicked" Button.VerticalOptions="CenterAndExpand"/>
                
            </HorizontalStackLayout>
        </VerticalStackLayout>
    </Frame>
</toolkit:Popup>

2

Masz:

<Label Text="{Binding drink}" />

To oznacza, że tutaj wyświetlasz cechę o nazwie "drink" z twojego BindingContext.

Twój BindingContext, obiekt klasy drinksclass ma tylko name oraz id.

1

@Ktos: Wielkie dzięki za pomoc i cenne wskazówki, teraz wszystko działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1