5

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

我的第二个问题是我是否还需要在更改时为模型PropertyChanged的子属性(PriceDataCompanyData)提出ViewModel.ActiveStock

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,它工作正常。为什么???

4

2 回答 2

3

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

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

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

sa_ddam213 已经回答了第二个问题。

高温高压

于 2013-02-17T23:27:43.200 回答
3

没有调用getter,因为据我所知,没有什么是“获取”值,唯一使用的属性是PriceData并且CompanyData这些不使用INotifyPropertyChanged

您必须INotifyPropertyChanged在您的Stock班级上实施UI以反映更改。

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));
        }
    }
}
于 2013-02-17T23:21:35.333 回答