WPF INotifyPropertyChanged没有更新标签

时间:2016-01-09 12:47:43

标签: wpf vb.net xaml inotifypropertychanged

我目前正在学习WPF的一些基础知识,而且我一直在寻找错误大约2天。希望你们能帮忙。

我尝试使用INotifyPropertyChanged和XAML中的绑定来更新我的UI(在本例中为标签的内容)。问题是:它只接受第一个值并将其放入内容中。此外,没有任何事情发生,但事件(OnPropertyChanged)被触发。

这就是我在XAML中所拥有的:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1" x:Class="MainWindow"
    Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:View x:Key="ViewModel"/>
    </Window.Resources>

    <Grid Margin="0,0,2,-4" DataContext="{Binding Source={StaticResource ViewModel}}">
....
    <Label x:Name="lbl_money" Grid.ColumnSpan="2" Content="{Binding Path=PropMoney}" HorizontalAlignment="Left" Margin="403,42,0,0" VerticalAlignment="Top">

这是我班级观看的必要部分:

Public Class View
Inherits ViewModelBase

Private rest1 As New Restaurant
Private mainPlayer As New Player
Private mycurrentMoney As Double = 3
Private currentClickIncrease = mainPlayer.PropClickIncrease

 Public Property PropMoney() As Double
    Get
        Return mycurrentMoney
    End Get
    Set(value As Double)
        mycurrentMoney = value
        OnPropertyChanged("mycurrentMoney")
    End Set
End Property

Sub SelfClicked()
    PropMoney() += 1
End Sub

最后但并非最不重要的是MainWindow类,我在其中实例化我的视图:

Class MainWindow

Private view As New View

    Sub New()
        InitializeComponent()
    End Sub

    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        view.SelfClicked()
    End Sub

End Class

所以我的 mycurrentMoney 增加了每次点击,但事件被触发但标签没有更新。

提前谢谢!

3 个答案:

答案 0 :(得分:2)

您的OnPropertyChanged("mycurrentMoney")声明未对您的媒体资产进行财产变更,因为它被称为 PropMoney

您必须在设置器中设置OnPropertyChanged("PropMoney")

答案 1 :(得分:2)

如果您使用Visual Studio 15,请使用NameOf运算符而不是字符串文字,如下所示:

NameOf(PropMoney);

如果您稍后重命名您的属性,它仍将与字符串文字相反,而不会。或者,修改OnPropertyChange以使用CallerMemberName

OnPropertyChange ([System.Runtime.CompilerServices.CallerMemberName] string memberName = "")
{

}

将填写属性名称,但这仅适用于当前属性的setter。

另外,为整个窗口设置DataContext(Setting DataContext in XAML in WPF)。 DataContext={StaticResource ViewModel}并且不要在绑定中使用Path,只需{Binding PropertyName}

答案 2 :(得分:0)

您的代码存在2个问题

首先,您为支持字段引发PropertyChanged事件,并将其提升为属性名称

OnPropertyChanged("PropMoney")

其次,您更改的属性属于View的不同实例,然后设置为DataContext。因此,在XAML中删除DataContext更改,只保留属性绑定

<Window ...>
    <Grid Margin="0,0,2,-4">
        <!-- .... -->
        <Label ... Content="{Binding Path=PropMoney}">

然后在DataContext的代码集MainWindow中添加到您创建和修改的实例

Class MainWindow

Private view As New View

    Sub New()
        InitializeComponent()
        DataContext = view
    End Sub

    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        view.SelfClicked()
    End Sub

End Class