从ViewModel强制刷新,没有任何变化

时间:2014-10-22 15:54:47

标签: c# wpf mvvm

我正在使用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,则显示“之前”。

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

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

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

对此有更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

通常,会在项目模型上提出更改通知。如果您的商品没有该功能,或者您不希望混淆具有更多数据/功能的商品,请考虑将每个商品包装在“商品视图模型”中。

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

CollectionViewSource.GetDefaultView(MyModelList).Refresh()