标签内容绑定仅更新一次

时间:2018-02-15 21:25:09

标签: c# wpf mvvm

我的标签似乎只从它绑定的属性获取数据一次。我让属性在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));
    }
}

1 个答案:

答案 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;