Problem z wyświetleniem Viewmodelu z mvvm

Odpowiedz Nowy wątek
2018-11-17 17:30
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

Pozostało 580 znaków

2018-11-17 17:32
0

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

Pozostało 580 znaków

2018-11-17 17:56
0

Ale jak to zrobić jak to zaimplementować?

Pozostało 580 znaków

2018-11-17 18:15

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";
    }
}

Pozostało 580 znaków

2018-11-17 18:21
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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