INotifyPropertyChanged.PropertyChanged已激发,但在表单加载后未更新UI
本文关键字:加载 表单 UI 更新 PropertyChanged INotifyPropertyChanged | 更新日期: 2023-09-27 18:00:04
下面是我的模型ViewModel
和xaml绑定的示例。视图模型实现了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 Template="{StaticResource StockTemplate}" DataContext="{Binding ActiveStock}" Tag="{Binding PriceData}" />
<UserControl Template="{StaticResource StockTemplate}" DataContext="{Binding ActiveStock}" Tag="{Binding CompanyData}" />
编辑:如果我删除UserControl的DataContext绑定,而是在ActiveStock更改时在代码隐藏中为这两个控件设置DataContext,那么它可以正常工作。为什么?
getter没有被调用,因为据我所见,没有任何东西"获取"值。只使用了PriceData
和CompanyData
属性,而这些属性不使用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