mike01010
mike01010

Reputation: 6088

INotifyPropertyChanged.PropertyChanged fired, but UI not updated after form loads

Below is an example of my model , ViewModel and xaml binding. The viewmodel implements INotifyPropertChanged. The problem i'm having is...when the wpf form first loads i set ActiveStock and i see both setter and getter being called and the ui is updated to reflect the data correctly.
However, when i later set StockViewModel.ActiveStock, FirePropertyChanged is invoked but i don't see the getter being called, and consequently the UI does not update to reflect the new data. Any ideas what might be happening here?

The second question i have is whether i also need to raise PropertyChanged for the child properties (PriceData and CompanyData) of my model when ViewModel.ActiveStock is changed?

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}" />

Edit: if i remove the DataContext binding for the UserControl and instead set the DataContext for these two controls in code behind when ActiveStock changes, it works fine. why???

Upvotes: 5

Views: 7846

Answers (2)

Sijmen Koffeman
Sijmen Koffeman

Reputation: 160

You might want to try to specify the mode property on your datacontext bindings.

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

I'm not sure that OneTime is the default binding for DataContext, but it would explain so if the above helps.

The second question has been answered by sa_ddam213.

HTH

Upvotes: 3

sa_ddam213
sa_ddam213

Reputation: 43636

The getter is not being called because as far as I can see nothing is "getting" the value, The only properties used are PriceData and CompanyData and these don't use INotifyPropertyChanged

You will have to implement INotifyPropertyChanged on your Stock class for the UI to reflect the changes.

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));
        }
    }
}

Upvotes: 4

Related Questions