Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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
Vb.net 调用SetProperty时未激发OnPropertyChanged_Vb.net_Prism - Fatal编程技术网

Vb.net 调用SetProperty时未激发OnPropertyChanged

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

我使用的是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, 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
  • 如果我把它设置为米格尔,那么它会在视图中显示安东尼奥
  • 等等。。。始终是最后一个值,而不是现在设置的值
只需添加OnPropertyChanged行,就可以了

谁能解释一下为什么会这样

多谢各位

于2015年1月30日更新 我创建了一个新的VB项目(名为TestPrismVB),安装了Prism,并编写了以下简单代码:

XAML文件是MainWindow.XAML:

<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