モデルビュービューモデルを実装しようとしています。しかし、私はそれを働かせることはできません。MVVMでの問題、バインドが表示されない
これは私のモデルと基底クラスです:
namespace GridCity.GUI {
class DateInfoModel : PropertyChangedBase {
private string _Date = string.Empty;
public string Date {
get {
return _Date;
}
set {
if (_Date != value) {
_Date = value;
OnPropertyChanged(nameof(Date));
System.Console.WriteLine(_Date);
}
}
}
}
}
namespace GridCity.GUI {
using System.ComponentModel;
public abstract class PropertyChangedBase : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
protected internal void OnPropertyChanged(string propertyName) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
System.Console.WriteLine("OnPropertyChanged: " + propertyName);
}
}
}
は、これは私のviewmodelです:
namespace GridCity.GUI {
class DateInfoViewModel : PropertyChangedBase {
public DateInfoViewModel(DateInfoModel model) {
Model = model;
}
public DateInfoModel Model { get; private set; }
}
}
そして、これが私の見解です:
<UserControl x:Class="GridCity.GUI.DateInfoView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:GridCity.GUI"
mc:Ignorable="d"
d:DesignHeight="60" d:DesignWidth="150">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
</Grid.RowDefinitions>
<Label Grid.Row="0" Grid.Column="0" FontWeight="ExtraBold" Content="{Binding Model.Date}"></Label>
<Label Grid.Row="1" Grid.Column="0" FontWeight="ExtraBold" Content="TEST"></Label>
</Grid>
</UserControl>
私は私の中でview.DataContext
を設定MainWindowコンストラクタ:
public MainWindow() {
InitializeComponent();
DateInfoView view = new DateInfoView();
Game.DateInfoModel = new DateInfoModel();
DateInfoViewModel viewModel = new DateInfoViewModel(Game.DateInfoModel);
view.DataContext = viewModel;
}
私は2番目のラベル(TEST
)を見ることができるので、ユーザーコントロールは理論上で動作するようです。しかし、私は最初のラベルに何も表示されません。しかし、_Date
が変更され、OnPropertyChanged
が呼び出されたときにコンソール上の出力を見ることができます。
私には何が欠けていますか?
this.DataContext = viewModel;
へ
どのように 'DataContext'を' DateInfoViewModel'のインスタンスに設定しますか? – dkozl
@ dkozl:申し訳ありませんが、その部分を忘れました。私は私の質問を編集しました。 – gartenriese
これは1つの質問に答えるが、別の質問を作成する。あなたは 'view'で何をしていますか?あなたはそれを作成し、 'DataContext'を設定しますが、それ以降は使用しません。表示されるインスタンスは、 'DataContext'を設定したインスタンスと同じインスタンスですか? – dkozl