Я решил опубликовать собственное решение, так как считаю, что оно самое простое и требует гораздо меньше кода, чем другие, которые я видел.
//AbstractViewModel implements INotifyPropertyChanged
public class MyObject : AbstractViewModel
{
private DateTime date = DateTime.UtcNow;
public DateTime Date
{
get
{
return date;
}
set
{
date = value;
OnPropertyChanged("Date");
}
}
public MyObject()
{
Timer t = new Timer();
t.Interval = 1000; //Update every second
t.Elapsed += T_Elapsed;
t.Enabled = true;
}
private void T_Elapsed(object sender, ElapsedEventArgs e)
{
OnPropertyChanged("Date");
}
}
Затем вы выполняете операцию относительного времени внутри конвертера:
using System;
using System.Globalization;
using System.Windows.Data;
namespace MyConverters
{
[ValueConversion(typeof(DateTime), typeof(string))]
public class RelativeTimeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DateTime Date = (DateTime)value;
if (Date == null) return "never";
return Utility.RelativeTime(Date);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
}
И добавить конвертер в привязку:
<Run Text="{Binding Date, Converter={StaticResource RelativeTimeConverter}}"/>
И для переключения, должен ли объект отмечаться галочкой, вы можете определить дополнительный конструктор или флаг в классе объекта, указывающий, включено ли такое поведение. Таким образом, если ваше приложение поддерживает изменение формата даты, вы можете просто выполнить итерации ваших объектов, проверить каждый флаг и удалить (или поменять местами) существующий конвертер привязки.