在没有任何更改的情况下从ViewModel强制刷新

本文关键字:ViewModel 刷新 情况下 任何更 | 更新日期: 2023-09-27 18:27:38

我正在使用MVVM模式在WPF中创建一个数据列表。数据本身通过转换器显示,转换器获取DateTime并将其转换为标志:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    DateTime myDate = (DateTime)value;
    return (myDate > DateTime.Now) ? "after" : "before";
}

myDate是模型对象中的属性,存储在ViewModel:中的ObservableCollection

ObservableCollection<MyModel> MyModelList

这与以下观点有关:

<DataTemplate>
    <TextBlock Text="{Binding MyModel.MyDate, Converter={StaticResource MyDateConverter}}" />

当表单最初加载时,它会正确显示文本;例如,如果表单在12:00加载,并且当前为11:58,则显示"before"。

我用计时器每分钟刷新一次:

void Refresh()
{
    System.Diagnostics.Debug.WriteLine("Refresh MyDate");
    RaisePropertyChanged("MyModelList");

但这不起作用,因为它只刷新列表,而不是绑定日期。我能想到的强制更新的唯一方法是手动迭代集合,并将每个日期更新为自己。

有没有更简单的方法?

在没有任何更改的情况下从ViewModel强制刷新

通常,会在项目模型上发出更改通知。如果您的项目没有这种功能,或者不想用更多的数据/功能来打乱项目,请考虑将每个项目包装在"项目视图模型"中。

或者,如果您的集合很小,并且计时器间隔足够长,则可以重置整个集合。刷新集合的默认ICollectionView会稍微便宜一点,而ItemsControl最终会与之绑定,尽管这样做可以说是一种代码气味:

CollectionViewSource.GetDefaultView(MyModelList).Refresh()