INotifyPropertyChanged.PropertyChanged已激发,但在表单加载后未更新UI

本文关键字:加载 表单 UI 更新 PropertyChanged INotifyPropertyChanged | 更新日期: 2023-09-27 18:00:04

下面是我的模型ViewModel和xaml绑定的示例。视图模型实现了INotifyPropertChanged。我遇到的问题是……当wpf表单第一次加载时,我设置了ActiveStock,我看到setter和getter都被调用了,ui也被更新以正确反映数据
然而,当我稍后设置StockViewModel.ActiveStock时,FirePropertyChanged被调用,但我没有看到getter被调用,因此UI不会更新以反映新数据。你知道这里会发生什么吗?

我的第二个问题是,当ViewModel.ActiveStock更改时,我是否也需要为我的模型的子属性(PriceDataCompanyData)引发PropertyChanged

public class Stock
{
    public string Ticker { get; set; }
    public StockData PriceData { get; set; }
    public StockData CompanyData { get; set; }
}
public class StockData
{
    ...
}
public class StockViewModel:INotifyPropertyChanged
{
    private Stock _activeStock;
    public Stock ActiveStock
    {
        get{ return _activeStock;}
        set{ _activeStock = value; FirePropertyChanged("ActiveStock");}
    }
    ...
}

XAML:

<UserControl Template="{StaticResource StockTemplate}" DataContext="{Binding ActiveStock}" Tag="{Binding PriceData}" />
<UserControl Template="{StaticResource StockTemplate}" DataContext="{Binding ActiveStock}" Tag="{Binding CompanyData}" />

编辑:如果我删除UserControl的DataContext绑定,而是在ActiveStock更改时在代码隐藏中为这两个控件设置DataContext,那么它可以正常工作。为什么?

INotifyPropertyChanged.PropertyChanged已激发,但在表单加载后未更新UI

getter没有被调用,因为据我所见,没有任何东西"获取"值。只使用了PriceDataCompanyData属性,而这些属性不使用INotifyPropertyChanged

您必须在Stock类上为UI实现INotifyPropertyChanged以反映更改。

public class Stock : INotifyPropertyChanged
{
    private string _ticker;
    private StockData _priceData;
    private StockData _companyData;
    public string Ticker
    {
        get { return _ticker; }
        set { _ticker = value; NotifyPropertyChanged("Ticker"); }
    }
    public StockData PriceData
    {
        get { return _priceData; }
        set { _priceData = value; NotifyPropertyChanged("PriceData"); }
    }

    public StockData CompanyData
    {
        get { return _companyData; }
        set { _companyData = value; NotifyPropertyChanged("CompanyData"); }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

您可能需要尝试在数据上下文绑定上指定模式属性。

DataContext="{Binding ActiveStock, Mode=OneWay}"

我不确定OneTime是否是DataContext的默认绑定,但如果以上有帮助,它会解释这一点。

第二个问题已由sa_ddam213回答。

HTH