我目前正在学习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 增加了每次点击,但事件被触发但标签没有更新。
提前谢谢!
答案 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