我的标签似乎只从它绑定的属性获取数据一次。我让属性在setter中引发了Property Changed事件,但是当属性的值被更改时,它会正确引发事件(我知道这是因为我设置了断点),但是窗口上的Label中的文本不会改变。我也许应该注意到带有标签的窗口不是主窗口,而是弹出的新窗口。
视图模型:
public class PurchaseVerificationViewModel : ViewModelBase
{
private WindowService.WindowService windowService = new WindowService.WindowService();
private string _verificationQuestion = "Question"; //default so i can check if it changed in the window
public string VerificationQuestion
{
get { return _verificationQuestion; }
set
{
if (_verificationQuestion != value)
{
_verificationQuestion = value;
OnPropertyChanged(nameof(VerificationQuestion));
}
}
}
}
窗口:
<Window>
<Window.DataContext>
<viewmodels:PurchaseVerificationViewModel/>
</Window.DataContext>
<Grid>
<Label Content="{Binding VerificationQuestion, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Window>
ViewModelBase:
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
答案 0 :(得分:0)
INotifyPropertyChanged 的实现没有问题,因为您正在调用已修改属性的通知。 因此,如果问题不在于提出通知的问题,那么它可能更倾向于正在积极地听取通知吗?
问题在于,您正在为类本身定义Window的DataContext
,而不是在应用程序的代码隐藏中使用和修改的实例。
由于您在xaml中定义DataContext
的方式,实际上在幕后发生的是,正在构造一个新的PurchaseVerificationViewModel
类(不是正在修改逻辑的那个)因此,您的VerificationQuestion
将返回其默认值(或者更确切地说是私人支持字段的默认值,“问题”)。
由于您希望基于源更改更新Label
(目标)的内容,您需要做的是将Window的DataContext
设置为特定实例您正在修改应用程序的逻辑,并确保将其定义为属性!
public PurchaseVerificationViewModel myViewModel {get;set;}
例如在 InitializeComponent()之后,在页面构造函数上,您可以初始化该属性并将其设置为DataContext,如下所示:
myViewModel = new PurchaseVerificationViewModel();
this.DataContext = myViewModel;