【问题标题】:How to refresh the UI in a metro app?如何在 Metro 应用程序中刷新 UI?
【发布时间】:2012-06-20 00:48:08
【问题描述】:

我在 XAML 页面中使用此代码:

<TextBox ItemsSource="{Binding Posters, Converter={StaticResource collectionToFirstElementConverter}, Mode=TwoWay}" />

Posters 是一个 ObsevableCollection,我正在使用一个转换器来获取集合并获取它的第一个元素。

当我使用异步过程时,文本框接收对象,这个没有元素 (Count=0),并调用转换器。

我试图在每次属性添加新元素时更新文本框,但不调用转换器。

我记得在 Silverlight 或 WPF 中,存在 SourceTrigger 或 UpdatePropertyChanged,但在 WinRT 中我看不到这种模式。

【问题讨论】:

  • 为什么不为数据上下文中的第一个元素公开一个属性?
  • 问题是我正在使用异步.. 所以当文本框尝试加载该属性时,它会变为空!所以我需要一种方法来让元素告诉 UI 刷新属性
  • 为什么不在异步操作完成时触发 OnChanged 事件(我认为这是事件名称)?
  • 不,我没有找到那个事件。实际上,我需要一些方法来刷新或更新代码以来的 UI。

标签: c# xaml windows-runtime microsoft-metro winrt-xaml


【解决方案1】:

实现这一点的最简单方法是相应地修改包含Posters 属性的视图模型。我可以看到两种方法(都假设您的视图模型实现了INotifyPropertyChanged):

  • Posters.CollectionChanged 添加一个事件处理程序,并在其中为Posters 引发INotifyPropertyChanged.PropertyChanged
  • 添加另一个属性FirstPoster,返回Posters 中第一个元素的值。在视图模型中向Posters.CollectionChanged 添加一个事件处理程序,并在其中为FirstPoster 引发INotifyPropertyChanged.PropertyChanged。这样您甚至不需要转换器。

我个人更喜欢第二种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多