Использование привязки OneWay (для обновления DataGrid с помощью PropertyChanged) нарушает сериализацию - PullRequest
0 голосов
/ 19 июня 2019

В моем приложении я использую DataGrid для отображения статуса некоторых фрагментов информации из класса, который я создал. Один из столбцов описывает количество времени, прошедшее с момента последнего обновления части класса. Это делается с помощью свойства, которое сравнивает переменную DateTime и возвращает строку, описывающую количество времени, которое прошло (х часов, минут и т. Д.) С момента этого события. Я использую INotifyPropertyChanged для этого строкового свойства раз в секунду, чтобы поддерживать его в актуальном состоянии.

При внесении изменений в мое приложение оно мне нужно, чтобы сохранить состояние всех данных в моем классе, и для этого я использую binaryFormatter.Serialize. Когда для привязки столбца DataGrid установлено значение Mode = OneWay, информация в DataGrid обновляется каждую секунду именно так, как я хочу, но операция сериализации завершается неудачно при попытке сохранить данные, сообщая мне «сериализация делегатов не поддерживается на этой платформе». Если я уберу Mode = OneWay, сериализация будет работать нормально, но DataGrid больше не будет обновлять эту информацию каждую секунду. Любопытно, что если я щелкаю ячейку с этой информацией несколько раз, данные обновляются, но они не обновляются автоматически на экране. Повторный переход на страницу также очевидно обновляет данные.

Вот XAML для столбца DataGrid

<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. Функционально пользовательский интерфейс отлично работает с OneWay, но он не позволяет сохранять изменения, так что это, очевидно, огромная проблема.

1 Ответ

0 голосов
/ 19 июня 2019

Я понял это! (Конечно, я сам разбираюсь в этом после нескольких часов поиска в Google, прежде чем опубликовать это)

Эта проблема, очевидно, связана с INotifyPropertyChanged. Я не знаю, почему это не вызывает проблемы, когда я не использую режим OneWay, но что решило это было так:

[field:NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;

Я уже пробовал [NonSerialized] для обработчика событий PropertyChanged, но он утверждал, что я не мог использовать его там, поэтому я решил, что он не был сериализуем, и поэтому не вызывал проблему.

Но потом я нашел эту страницу, на которой в качестве решения было указано [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

и это решило!

...