Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf InotifyPropertyChanged:表达式递归调用包含的属性_Wpf_Vb.net - Fatal编程技术网

Wpf InotifyPropertyChanged:表达式递归调用包含的属性

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 看代码我想做什么这与上面

如果某些条件匹配,那么我想更改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属性,你说这也有同样的问题。它是否解决了这个问题?