我正在使用自定义类来跟踪游戏中的日期,因为 DateTime 不允许虚构设置。我将课程绑定到Label
我的窗口中的 a 。初始化时,它显示正常,但当我尝试提前日期时拒绝更新。在 ViewModel 中的以下属性中,消息框确认 setter 触发,但值被视为相同并且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
,但都没有奏效。这是我能够让 setter 完全触发的唯一方法(这在 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
此外,我的 ViewModel 继承自 MVVM Light 的ViewModelBase
. 其他绑定属性工作没有任何问题。
更新: Per Sniffer 的建议,AddDays
现在为:
public Date AddDays(int value)
{
this._day += value;
RaisePropertyChanged(() => Year);
RaisePropertyChanged(() => Season);
RaisePropertyChanged(() => DayOfYear);
return this;
}
用户界面仍然没有更新。
当我打电话...
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
不需要提升属性,甚至不必是可观察的。鉴于此信息,如果有人可以提出改进建议,我会全力以赴。如果没有,我会就此收工。