Wpf InotifyPropertyChanged:表达式递归调用包含的属性
如果某些条件匹配,那么我想更改Set属性的值 例如,项目总重量=5.55项目销售率=2.892销售值=16.05(销售值应四舍五入至小数点后2位),但实际(销售值/总重量)为2.892。它应该是2.89189(比率应该四舍五入到小数点后8位) 因此,每当我输入rate 2.892,它将设置rate属性,并设置Sales Value属性,然后再从那里设置rate属性 通过执行上述属性方面的操作,没有问题,但我的用户界面没有更新为Sales Rate文本框中的2.89189 看代码我想做什么这与上面的例子无关,但有相同的问题Wpf InotifyPropertyChanged:表达式递归调用包含的属性,wpf,vb.net,Wpf,Vb.net,如果某些条件匹配,那么我想更改Set属性的值 例如,项目总重量=5.55项目销售率=2.892销售值=16.05(销售值应四舍五入至小数点后2位),但实际(销售值/总重量)为2.892。它应该是2.89189(比率应该四舍五入到小数点后8位) 因此,每当我输入rate 2.892,它将设置rate属性,并设置Sales Value属性,然后再从那里设置rate属性 通过执行上述属性方面的操作,没有问题,但我的用户界面没有更新为Sales Rate文本框中的2.89189 看代码我想做什么这与上面
Imports System.ComponentModel
Public Class TextViewModel
Implements INotifyPropertyChanged
Dim _View As MainWindow
Public Sub New(ByVal View As MainWindow)
_View = View
End Sub
Private Property _MyValue As String
Public Property MyValue As String
Get
Return _MyValue
End Get
Set(value As String)
_MyValue = value
NotifyPropertyChanged("MyValue")
If value = "ABC" Then
MyValue = "PQR"
End If
End Set
End Property
Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Protected Sub NotifyPropertyChanged(info As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub
End Class
如前所述,若我写ABC和tab,那个么PQR应该显示在同一个文本框中
可能吗?您提前通知属性更改。您首先通知它已更改,然后再更改它。您应该更改它,然后通知。希望有帮助
我的评论太长了,所以我在这里加了一句:我想我理解你的意思;在代码示例中,您正在从setter递归调用setter。但是在您的书面评论中,您正在来回设置属性(可能是一个无限循环)。这是两个不同的问题。在代码示例中,如果将NotifyPropertyChanged事件移动到setter的最末端,它将按照您的需要工作。但在所有内容都更改后,它将NotifyPropertyChanged两次(一次用于“子”setter调用,一次用于“父”setter调用)。在编写的示例中,首先更新_ItemRate,然后设置ItemValue。在ItemValue中,更新_ItemValue,然后更新_ItemRate(非ItemRate),并在ItemValue的SETTER中更改ItemValue和ItemRate的NotifyPropertyChanged。这将使您脱离无限循环。但无需递归调用集合
对NotifyPropertyChanged的额外调用只是额外的流量
Set(value As String)
If _MyValue = value then
return
End If
_MyValue = value
If _MyValue = "ABC" Then
_MyValue = "PQR"
End If
NotifyPropertyChanged("MyValue")
End Set
定义
MyValue
属性时,您可能希望将NotifyPropertyChanged(“MyValue”)
向下移动到End Set
之前。这只是上面给出的一个示例,以供理解。我用项目示例描述的实际问题。每当我输入ItemRate的值时,首先它将NotifyItemRate的属性,从同一属性我将计算ItemValue,因此ItemValue属性将通知。现在ItemValue只有两个小数,因此我想再次更新ItemRate。所以,我再次在ItemValue属性中更改ItemRate属性。正如前面所述,您询问我是否编写了ABC和tab,然后PQR应该显示在同一个文本框中。可能吗?。我上面的评论正好告诉你为什么你的简单代码不起作用,以及如何实现这一点……并且只在值不同时通知。这只是上面给出的一个示例,以供理解。我用项目示例描述的实际问题。每当我输入ItemRate的值时,首先它将NotifyItemRate的属性,从同一属性我将计算ItemValue,因此ItemValue属性将通知。现在ItemValue只有两个小数,因此我想再次更新ItemRate。所以我再次在ItemValue属性中更改ItemRate属性。这只是上面给出的一个理解示例。我用项目示例描述的实际问题。每当我输入ItemRate的值时,首先它将NotifyItemRate的属性,从同一属性我将计算ItemValue,因此ItemValue属性将通知。现在ItemValue只有两个小数,因此我想再次更新ItemRate。所以我再次在ItemValue属性中更改了ItemRate属性,你说这也有同样的问题。它是否解决了这个问题?