Vb.net 调用SetProperty时未激发OnPropertyChanged
我使用的是Prism 5和Visual Basic,但我想C#中的解决方案对我来说也是有效的 我遇到的问题是,此代码工作正常:Vb.net 调用SetProperty时未激发OnPropertyChanged,vb.net,prism,Vb.net,Prism,我使用的是Prism 5和Visual Basic,但我想C#中的解决方案对我来说也是有效的 我遇到的问题是,此代码工作正常: Private Property _nombreEnvio As String Public Property nombreEnvio As String Get Return _nombreEnvio End Get Set(value As String) SetProperty(_nombreEnvio, v
Private Property _nombreEnvio As String
Public Property nombreEnvio As String
Get
Return _nombreEnvio
End Get
Set(value As String)
SetProperty(_nombreEnvio, value)
OnPropertyChanged("nombreEnvio")
End Set
End Property
但是,如果删除调用OnPropertyChange的行,它不会更新视图中的字段:
Private Property _nombreEnvio As String
Public Property nombreEnvio As String
Get
Return _nombreEnvio
End Get
Set(value As String)
SetProperty(_nombreEnvio, value)
' THIS CODE DOES NOT REFRESH THE VIEW
End Set
End Property
假设SetProperty调用应该调用OnPropertyChanged,但它没有。它有一种奇怪的行为,即用最后一个值更新视图。我自己解释,因为这很复杂:
- 如果Nombrenvio是CARLOS,我将它设置为PEDRO,它不会更新视图,它仍然显示CARLOS
- 如果我将其设置为ANTONIO,则会在视图中显示PEDRO
- 如果我把它设置为米格尔,那么它会在视图中显示安东尼奥
- 等等。。。始终是最后一个值,而不是现在设置的值
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:TestPrismVB"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<vm:pruebaViewModel/>
</Window.DataContext>
<StackPanel>
<TextBox Text="{Binding anotherProperty, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Text ="{Binding oneProperty}"/>
</StackPanel>
</Window>
如果您运行这个简单的项目,并键入1234,您将看到TextBlock更新落后一步(它将显示123而不是1234)
这是一个VB错误吗?棱镜虫?我做错什么了吗
谢谢好吧,我现在可以帮你了。我不是Visual Basic开发人员,所以我没有看到您代码中的“错误”,但经验丰富的VB.NET专家可以在5分钟内帮助您 所以Prism和Visual Basic完全按照它们应该做的做所有事情,问题是由您的代码引起的,这一行对此负责:
Private Property _oneProperty As String
SetProperty()
方法接受属性存储ByRef
,但您提供了一个属性作为存储。在这种情况下,当您将属性作为ByRef
参数传递时,VB将属性值复制到临时变量,传递变量ByRef
,并将变量中的值赋回属性
观察到的行为有一个简单的解释:Prism引发PropertyChanged
事件,WPF绑定在之前请求新的属性值,它将由VB从实际传递的临时变量ByRef
中赋值
TL;DR解决方案是:
替换这个
Private Property _oneProperty As String
Private Property _anotherProperty As String
用这个
Private _oneProperty As String
Private _anotherProperty As String
我不熟悉Prism,但是你不应该像第一个代码片段那样调用OnPropertyChanged吗?仅从这个例子来看:我认为这是一种没有棱柱的方式。看看这个博客,它解释得很好:。谢谢更多数据:我已经测试了这里介绍的DoSomething函数,调用的membername工作正常。我不知道会出什么问题。你是如何被XAML束缚的?你能把它也贴出来吗?OnPropertyChanged将向UI标记它需要再次重新提取“get”。我不知道你的SetProperty()方法在做什么,但从我所知道的来看,它似乎最终调用了OnPropertyChanged,但很可能是在你更改属性之前(因此它告诉UI在你实际更新值之前进行更新,这就是提取“旧”值)。链接的博客使用委托方法,最终调用OnPropertyChanged。我只是在我所有的setter中调用它,从来没有遇到过问题,为什么不使用它呢?这里有XAML代码@TrialAndError:
。SetProperty()方法不是我的,它是Prism SetProperty()方法,反正我没有更改它。谢谢你这么简单,我都快疯了。非常感谢,这是正确的解决方案。
Private _oneProperty As String
Private _anotherProperty As String