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

C# INotifyPropertyChanged.PropertyChanged已激发,但在加载表单后未更新UI,c#,wpf,xaml,C#,Wpf,Xaml,下面是我的模型、ViewModel和xaml绑定的一个示例。viewmodel实现了INotifyPropertChanged。我遇到的问题是…当wpf表单第一次加载时,我设置了ActiveStock,我看到setter和getter都被调用,ui被更新以正确反映数据。 但是,当我稍后设置StockViewModel.ActiveStock时,调用了FirePropertyChanged,但我看不到正在调用getter,因此UI不会更新以反映新数据。你知道这里会发生什么吗 我的第二个问题是,当V

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

我的第二个问题是,当
ViewModel.ActiveStock
发生更改时,是否还需要为我的模型的子属性(
PriceData
CompanyData
)提出
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的DataContext绑定,并在ActiveStock更改时在代码隐藏中为这两个控件设置DataContext,那么它就可以正常工作。为什么???

没有调用getter,因为据我所知,没有“获取”值,只使用了
PriceData
CompanyData
属性,而这些属性没有使用
INotifyPropertyChanged

对于
UI
,您必须在
Stock
类上实现
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绑定上指定mode属性

DataContext="{Binding ActiveStock, Mode=OneWay}"
我不确定OneTime是否是DataContext的默认绑定,但如果上面有帮助的话,它可以解释这一点

第二个问题已由sa_ddam213回答


HTH

如果我在这些类上实现INotifyPropertyChanged,则仍然必须触发NotifyPropertyChanged,以便uielement知道它需要获取某些内容…因此您是说ViewModel类必须触发这些事件,即使它唯一关心的属性是它自己的ActiceStock属性?我想你的答案是最接近的。问题不是我需要为成员属性触发事件(我已经在这么做了),而是FirePropertyChanged参数中的一个输入错误。什么设置了xaml文件的datacontext?在表单中,我有一个公共成员“public StockViewModel ViewModel{get;set;}”我在表单的构造函数中创建并分配StockViewmOdel的实例,然后分配DataContext=ViewModel在加载的事件中尝试这样做:public MainWindow(){InitializeComponent();Loaded+=MainWindow_Loaded;}void MainWindow_Loaded(对象发送方,RoutedEventTarget e){ViewModel=new StockViewModel();DataContext=ViewModel;}这也不起作用。唯一起作用的是从xaml中删除与ActiveStock的绑定,并在代码隐藏中显式设置用户控件的DataContext。我就是不明白。尝试用对我有效的替换。(当然,你的StockTemplate应该成为一个。向我们显示视图的代码隐藏,以便我们可以看到您是如何绑定ViewModel并在ActiveStock中设置数据的。1)查看StockTemplate的xaml会很有帮助。2) 是否在InitializeComponent()之前或之后设置视图的DataContext?在…之后,问题被证明是FirePropertyChanged参数中的输入错误!天哪……我希望有更好的方法(不经过思考)来处理InotifyPropertyChanged。
DataContext="{Binding ActiveStock, Mode=OneWay}"