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
.
Kopiuj
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;
}
}
Kopiuj
<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:
Kopiuj
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ć:
Kopiuj
internal class ViewModel
{
public Model Model { get; set; }
public ViewModel()
{
Model = new Model();
Model.Slowo = "osiem";
}
}