在没有任何更改的情况下从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");
但这不起作用,因为它只刷新列表,而不是绑定日期。我能想到的强制更新的唯一方法是手动迭代集合,并将每个日期更新为自己。
有没有更简单的方法?
通常,会在项目模型上发出更改通知。如果您的项目没有这种功能,或者不想用更多的数据/功能来打乱项目,请考虑将每个项目包装在"项目视图模型"中。
或者,如果您的集合很小,并且计时器间隔足够长,则可以重置整个集合。刷新集合的默认ICollectionView
会稍微便宜一点,而ItemsControl
最终会与之绑定,尽管这样做可以说是一种代码气味:
CollectionViewSource.GetDefaultView(MyModelList).Refresh()