使用OneWay绑定(保持DataGrid使用PropertyChanged更新)会破坏序列化

时间:2019-06-19 02:14:16

标签: c# serialization data-binding uwp

在我的应用程序上,我正在使用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完美配合,但是它破坏了保存更改的能力,因此这显然是一个巨大的问题。

1 个答案:

答案 0 :(得分:0)

我知道了! (当然,在经过数小时的搜索之后,我自己找出了答案,然后再发布此信息)

该问题显然与INotifyPropertyChanged有关。我不知道为什么当我不使用OneWay模式时它不会引起问题,但是解决问题的方法是:

[field:NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;

我之前曾为PropertyChanged事件处理程序尝试过[NonSerialized],但是它声称我不能在其中使用它,因此我认为它最初不是可序列化的,因此也没有引起问题。 / p>

但是后来我发现此页面列出了[field:NonSerialized]作为解决方案:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/b3aa38fb-df9f-4dd0-b3dc-a767f8c8b620/problem-in-serialize-a-class-that-implements-inotifypropertychanged?forum=wpf

那解决了!