【问题标题】:Using RelativeTimeConverter and updating the Textblock's text as time goes by使用 RelativeTimeConverter 并随着时间的推移更新 Textblock 的文本
【发布时间】:2012-11-30 12:18:42
【问题描述】:

在我的 MainPage.xaml 中,我有一个 ListBox,其数据模板如下:

<DataTemplate>
<TextBlock Name="DateTextBlock"  Text="{Binding Modified,  Converter={StaticResource RelativeTimeConverter}}"/>           
</DataTemplate>        

当应用程序启动时,转换完成一次,然后直到我重新启动应用程序,文本块的文本保持不变,即使我导航到另一个页面并返回 MainPage.xaml 。

我想要的只是不断地使用转换器,而不仅仅是在 Modified 属性更改时使用一次,以显示时间在流逝,因为用户正在使用我的应用程序。这怎么可能实现?

【问题讨论】:

    标签: c# windows-phone-7 xaml converter silverlight-toolkit


    【解决方案1】:

    你使用INotifyPropertyChanged吗?请参阅 this article 非常清楚地解释数据绑定。

    编辑:根据来自 cmets 的新信息,您已使用 INotifyPropertyChanged,但搜索通知 UI 有关属性的解决方案已定期更改。所以考虑使用某种计时器,例如DispatcherTimer

    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromSeconds(4);
    timer.Tick += delegate(object s, EventArgs args)
    {
        foreach (YourItem item in ViewModel.Items)
        {
            item.NotifyPropertyChanged("Modified");
        };
    }
    timer.Start();
    

    还(当然)将此方法添加到 YourItem 类:

    public void NotifyPropertyChanged(string propertyName)  
    {
        OnPropertyChanged(propertyName); 
    }
    

    【讨论】:

    • 我确实使用 INotifyPropertyChanged 但这与我的问题无关。 “Modified”属性没有改变(它的值被赋值一次,由DateTime.Now()),但随着时间的推移,RelativeTimeConverter提供的相关时间标签应该改变(例如:几分钟前,大约一个小时前、24 小时前等)。这不会发生,除非我退出应用程序并重新启动它。所以问题就像:“我怎样才能强制绑定每 4 秒刷新一次?
    • 考虑使用 DispatcherTimer 为已修改的属性引发 OnPropertyChanged 事件。
    • 我认为您的建议应该可行,但我无法实施,因为我还有另一个问题,我不知道如何解决。我正在使用 ObservableCollection,但像这样: MyClass> obsList = new MyClass>(MyClass_args);如果它是一个简单的 ObservableCollection,那么您的建议的实施对我来说将是直截了当的。但在这种情况下,我不知道该怎么做,因为 MyClass> 没有公共 GetEnumerator 定义。
    • 为什么不实现属性暴露TObservableCollection&lt;CustomClass&gt;就是这种情况)并枚举呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2020-07-24
    相关资源
    最近更新 更多