【问题标题】:WPF how to update the View binded to ReadOnly property in ViewModelWPF如何更新ViewModel中绑定到ReadOnly属性的视图
【发布时间】:2013-04-03 12:45:17
【问题描述】:

我将 WPF 窗口标题属性绑定到 ViewModel ReadOnly 属性为:

Title="{Binding ClientAndDate}"

ViewModel 属性如下所示:

Public ReadOnly Property ClientAndDate As String
    Get
       Return SelectedClient.Name) & " " & SelectedClient.Date)
    End Get
End Property

我在 ViewModel 中实现了 INotifyPropertyChanged,但由于这是 ReadOnly 属性,当 SelectedClient.Name 或 SelectedClient.Date 发生更改时,它将如何通知 UI 进行更新?

【问题讨论】:

  • 我认为 readonly 不会影响 INotifyPropertyChanged 的行为?你有什么问题吗?
  • 是的,但他必须通知 UI abaout 更改。即他必须调用 changet 事件。

标签: wpf mvvm readonly


【解决方案1】:

如果您订阅了 SelectedClient 的 PropertyChanged 事件,那么只要 NameDate 是属性从 @987654325 更改的原因,您就可以在 ClientAndDate 属性的视图模型中引发属性更改事件@。

即使ClientAndDate 属性是只读的,在视图模型中的任何位置为其发出属性更改通知都会导致绑定子系统从该属性刷新自身。

【讨论】:

  • 是的,这就是我已经在使用的。只是认为这不是最佳实践,因为当有很多只读属性时,管理它可能会变得非常混乱。在其他地方也对此进行了研究,似乎真的没有完全优雅的解决方案。
【解决方案2】:

你必须做一些“通知”方法。

喜欢这个。

protected void OnPropertyChanged(string name)
{
     PropertyChangedEventHandler handler = PropertyChanged;
     if (handler != null)
     {
         handler(this, new PropertyChangedEventArgs(name));
     }
}

并在每次您需要更新 UI 时使用“ClientAndDate”参数调用它。

“ClientAndDate”是更新的属性的名称。

Here 是 GET 语句的完整示例,但您可以以同样的方式使用它。

【讨论】:

  • Ôo 我不明白。如果这个方法是在视图类中实现的,它应该如何有用?
  • 那么你的第一句话是误导你必须在你的页面/窗口类中创建一些“通知”方法。我没有点击你的链接。
  • 没有。这个方法是不是被propertyChanged事件调用了。 handler(this, new PropertyChangedEventArgs(name));
  • 我知道你帖子的其余部分是什么意思。但是第一句话仍然具有误导性,因为您说的是页面/窗口类。你必须只改写它,一切都会好起来的......;o)
  • 哦。是的。你说的对。我忘记了他在 ViewModel 中想要这个。对不起;D
猜你喜欢
  • 2013-10-31
  • 1970-01-01
  • 2011-02-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 2012-05-28
相关资源
最近更新 更多