在我的应用程序上,我正在使用DataGrid来显示我创建的类中的某些信息的状态。其中一列描述自上次更新课程的一部分以来经过的时间。这是通过使用一个属性来完成的,该属性将比较DateTime变量并返回一个字符串,该字符串描述自该事件以来经过的时间(x小时,分钟等)。我每秒对该字符串属性使用INotifyPropertyChanged,以使其保持最新状态。
在我的应用程序中进行更改时,我需要它来保存类中所有数据的状态,为此我使用binaryFormatter.Serialize。当DataGrid列的绑定设置为Mode = OneWay时,DataGrid中的信息完全按照我想要的每秒刷新一次,但是在尝试保存数据时序列化操作失败,告诉我“此平台上不支持序列化委托”。如果我取出Mode = OneWay,则序列化就可以了,但是DataGrid不再每秒更新一次此信息。奇怪的是,如果我单击带有此信息的单元格几次,则数据将被刷新,但不会在屏幕上自动刷新。重新导航到该页面显然也会更新数据。
这是DataGrid列的XAML
<controls:DataGridTemplateColumn Header="Last Update">
<controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate x:DataType="local:Network">
<TextBlock Text="{x:Bind LastUpdate}" Margin="15" Opacity="0.65" FontSize="12" VerticalAlignment="Center"/>
</DataTemplate>
</controls:DataGridTemplateColumn.CellTemplate>
</controls:DataGridTemplateColumn>
这是它所指的课程的一部分:
DateTime _lastupdate;
public string LastUpdate
{
get
{
TimeSpan diference = (DateTime.Now - _lastupdate);
if (diference.TotalHours > 24)
{
return " (updated " + diference.Days + " Days ago)";
}
else if (diference.TotalMinutes > 60)
{
return " (updated " + diference.Hours + " Hours ago)";
}
else if (diference.TotalSeconds > 60)
{
return " (updated " + diference.Minutes + " Minutes ago)";
}
else
return " (updated " + diference.Seconds + " Seconds ago)";
}
}
我真的不知道为什么会发生这种情况,如果我不能实时更新此数据网格,我将无法实现使用以下功能的应用程序的核心部分:我为未来计划的DataGrid。从字面上看,正常运行的应用程序和损坏的应用程序之间的唯一区别是Mode = OneWay。 UI在功能上可以与OneWay完美配合,但是它破坏了保存更改的能力,因此这显然是一个巨大的问题。
答案 0 :(得分:0)
我知道了! (当然,在经过数小时的搜索之后,我自己找出了答案,然后再发布此信息)
该问题显然与INotifyPropertyChanged有关。我不知道为什么当我不使用OneWay模式时它不会引起问题,但是解决问题的方法是:
[field:NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
我之前曾为PropertyChanged事件处理程序尝试过[NonSerialized],但是它声称我不能在其中使用它,因此我认为它最初不是可序列化的,因此也没有引起问题。 / p>
但是后来我发现此页面列出了[field:NonSerialized]作为解决方案:
那解决了!