【问题标题】:RaisePropertyChanged doesn't update bindingRaisePropertyChanged 不更新绑定
【发布时间】:2011-02-17 11:57:10
【问题描述】:

我遇到了一些奇怪的行为。我有一个像这样绑定到属性的控件:

<HyperlinkButton x:Name="ProjectBeheerLink"
       Visibility="{Binding IsBeheerder, Converter={StaticResource VisibilityConverter}}"/>

在我的视图模型中,我的属性是这样实现的:

Public ReadOnly Property IsBeheerder As Boolean
    Get
        Return iwtApp.AllMyFunctieRollen.Any(Function(x) x.Rol.Equals(Constants.RoleBeheerder))
    End Get
End Property

然后当我在回调方法中引发 PropertyChanged 事件时

Private Sub GetMyPersonCompleted(ByVal lo As LoadOperation(Of FunctieRol))
    'Init FunctieRollen ect. ...
    RaisePropertyChanged(Function() Me.IsBeheerder)
End Sub

我的绑定没有更新。

但是!如果我实现这样的后端字段:

        _isBeheerder = iwtApp.AllMyFunctieRollen.Any(Function(x) x.Rol.Equals(Constants.RoleBeheerder))
        RaisePropertyChanged(Function() Me.IsBeheerder)

然后像这样改变我的财产:

Public ReadOnly Property IsBeheerder As Boolean
    Get
        Return _isBeheerder
    End Get
End Property

一切正常...有人可以解释一下这种行为吗?

只是好奇为什么..

【问题讨论】:

  • 我不太明白您在非工作版本中在哪里引发属性更改事件...
  • 用荷兰语编程有什么意义? :)
  • @Daniel:我提出了在服务回调中更改的属性。我将编辑我的问题以提供更清晰的信息。 @史蒂文:否则翻译所有实体是个混蛋:P
  • 您是否检查了 RaisePropertyChanged 是否真的被调用,并且它引发了属性名称设置为“IsBeheerder”的事件?我不明白 RaisePropertyChanged 参数的 VB 语法
  • @Daniel: RaisePropertyChanged 事件实际上是使用正确的属性名称调用和引发的。我通常在 C# 中编程,但 atm 我在一个需要 VB.NET 的客户那里。奇怪的是,如果使用保存该值的后端字段,它就可以工作,其余的代码没有太大变化。

标签: wpf vb.net silverlight data-binding mvvm


【解决方案1】:

实现绑定属性的最佳方式如下:

    Dim _isBeheerder As Boolean
    Public ReadOnly Property IsBeheerder As Boolean
        Get
            Return _isBeheerder
        End Get
        Set
            If value <> _isBeheerder Then
                _isBeheerder = value
                RaisePropertyChanged(Function() Me.IsBeheerder)
            End If
        End Get
    End Property

然后在您的服务回调中,您只需设置此属性:

    Private Sub GetMyPersonCompleted(ByVal lo As LoadOperation(Of FunctieRol))
        IsBeheerder = myNewValue
    End Sub

【讨论】:

  • 问题是当我从服务中收到我的实体时,我需要调用 RaisePropertyChanged。 RaisePropertyChanged 也不是不可访问的吗?由于您从 getter 返回之前,您可以调用 RaisePropertyChanged。
  • RaisePropertyChanged 是不可访问的,无论如何也没有任何意义。它应该在 Setter 而不是 Getter 中调用,因为调用 getter 是为了响应事件,而不是相反。
  • 是的,你们都是对的 - 抱歉,误读了原始代码(毕竟是荷兰语!) - 更新了我的答案。
  • 我理解你的回答,这是正确的,但我想避免为我的属性编写 setter,因为它是另一个暴露该属性的对象。所需的集合被加载到对象 iwtApp 中。我只是想知道绑定中是否存在某种错误,当我将其公开为 LINQ 查询时,它不会检测到我的属性的更改。
猜你喜欢
  • 2017-03-18
  • 2019-05-21
  • 1970-01-01
  • 2015-09-03
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多