DateTime では架空の設定が許可されていないため、カスタム クラスを使用してゲームの日付を追跡しています。ウィンドウ内の a にクラスをバインドしてLabel
います。初期化すると問題なく表示されますが、日付を進めようとすると更新が拒否されます。ViewModel にある次のプロパティでは、セッターが起動したことを確認するメッセージ ボックスが表示されますが、値は同じと見なされ、RaisePropertyChanged()
呼び出されることはありません。
public Date Date
{
get { return DataManager.Data.Date; }
set
{
//Messagebox will display here...
if (DataManager.Data.Date == value)
return;
//...But not here
DataManager.Data.Date = value;
RaisePropertyChanged(() => Date);
}
}
if ステートメントを取り出してみましたが、まだ更新されません。いくつかの更新方法を試しましDate
たが、どれもうまくいきませんでした。これは、セッターをまったく起動させることができた唯一の方法です(これはViewModelのコマンドで呼び出されます):
Date = Date.AddDays(1);
メッセージボックスは、これが日付を適切に更新していることを確認します (もちろん、ボックス内で)。
Date.cs
クラス全体は次のとおりです。
public enum Season { Light, Shadow }
public class Date : ObservableObject
{
#region Members
private int _day;
#endregion
#region Properties
public int Year
{
get { return _day / 100; }
}
public Season Season
{
get { return (DayOfYear < 70) ? Season.Light : Season.Shadow; }
}
public int DayOfYear
{
get { return _day % 100; }
}
#endregion
#region Construction
public Date(int year, int day)
{
_day = (100 * year) + day;
}
#endregion
#region Methods
public Date AddDays(int value)
{
this._day += value;
return this;
}
public override string ToString()
{
return string.Format("{0} {1}, {2}", DayOfYear, Season, Year);
}
#endregion
}
これが XAML です。おそらく役立つでしょう。さまざまなバインディング オプションを試しました。どれも機能しません。
<Label Content="{Binding Date}"
Grid.Row="1"
Grid.Column="4"
FontFamily="Pericles"
FontSize="16"
VerticalAlignment="Center"
HorizontalAlignment="Right" />
Date
この時点で、ビューを更新するために何をすべきかわかりません。アドバイスをいただければ幸いです。
更新:私は MVVM Light を使用していることに言及する必要がありObservableObject
ましRaisePropertyChanged
たViewModelBase
。その他のバインドされたプロパティは問題なく機能します。
更新: Sniffer の提案によると、次のAddDays
ようになります。
public Date AddDays(int value)
{
this._day += value;
RaisePropertyChanged(() => Year);
RaisePropertyChanged(() => Season);
RaisePropertyChanged(() => DayOfYear);
return this;
}
UI はまだ更新されません。
電話したら…
Date = Date.AddDays(1);
RaisePropertyChanged(() => Date);
System.Windows.MessageBox.Show(Date.ToString());
...コマンド内では、Label は変更されませんが、MessageBox には更新日が正しく表示されます。
更新 + 考えられる解決策:何とか機能させることができました。
ビューモデルで:
public string Date
{
get { return DataManager.Data.Date.ToString(); }
}
...そしてコマンドで
DataManager.Data.Date.AddDay(1);
RaisePropertyChanged(() => Date);
でDate.cs
:
public void AddDay(int value)
{
this._day += value;
}
このメソッドではプロパティを上げる必要はなく、監視可能である必要Date
さえありません。この情報があれば、誰かが改善を提案できるなら、私はすべて耳にします。そうでない場合は、これで 1 日と呼びます。