Problem z wyświetleniem Viewmodelu z mvvm

0

Witam mam pewien problem ponieważ ostatnio zacząłem uczyć się mvvm i podczas nauki napotkałem pewien problem ponieważ zrobiłem model i zrobiłem w nim stringa słowo z potem do tego stringa w viewmodelu przypisałem słowo osiem i zapisałem go w funkcji słowo po czym wczytałem go w xamlu i niestety to nie działa i chciał bym wiedzieć czemu tak jest poniżej umieszczam zdjęcia żeby było łatwiej to rozpatrzec

0

Hasło kluczowe: INotifyPropertyChanged. Potrzebujesz zaimplementować taki interfejs, twój ViewModel oraz Model muszą powiadomić widok, że ich stan się zmienił.

0

Ale jak to zrobić jak to zaimplementować?

2

Przepraszam, masz więcej błędów. Wrzucaj kod bezpośrednio do posta, będzie go łatwiej analizować (a przede wszystkim będzie można kopiować). Twoja metoda Loader() nigdy się nie wykonuje, stąd nigdy twój ViewModel nie tworzy w sobie obiektów i ich nie wypełnia. Tu jest problem.

Zamiast metody Loader() zrób sobie konstruktor, a w widoku musisz się zbindować nie do właściwości Model, ale Model.Slowo.

internal class Model
{
    public string Slowo { get; set; }
}

internal class ViewModel
{
    public Model Model { get; set; }

    public ViewModel()
    {
        Model m = new Model();
        m.Slowo = "osiem";
        Model = m;
    }
}
<Window.DataContext>
    <local:ViewModel />
</Window.DataContext>
<Grid>
    <Label Content="{Binding Model.Slowo}" />
</Grid>

Niemniej - problem i tak będzie, bo nie masz INotifyPropertyChanged, i jeśli kiedyś zmienisz zawartość swojego Modelu, to i tak będzie stara wartość wyświetlana. W takiej najprostszej wersji możesz zrobić coś takiego:

internal class Model : INotifyPropertyChanged
{
    private string slowo;

    public string Slowo
    {
        get
        {
            return slowo;
        }

        set
        {
            if (this.slowo != value)
            {
                slowo = value;
                OnPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName]string name = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

Jak widzisz, jeśli zmieni się wartość właściwości Słowo, on wywołuje metodę OnPropertyChanged(). Metoda ta dostanie jako swój parametr nazwę elementu, który ją wywołał (bo ma [CallerMemberName]), a ona odpali zdarzenie PropertyChanged, na które (niejawnie) nasłuchuje widok. Teraz jak kiedykolwiek (np. po naciśnięciu przycisku) zmienisz zawartość właściwości Slowo, to i tak widok to odzwierciedli.

Możesz też uprościć swój ViewModel troszkę, zamiast tworzyć nowy obiekt i podmieniać:

internal class ViewModel
{
    public Model Model { get; set; }

    public ViewModel()
    {
        Model = new Model();
        Model.Slowo = "osiem";
    }
}
0

Bardzo dzięki twoja odpowiedz bardzo mi pomogła :) Szczególnie bardzo dziękuje za pomoc z INotifyPropertyChanged bo to na pewno bardzo mi się przyda

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