5

以下は、私のモデルViewModelとxamlバインディングの例です。ビューモデルはを実装しINotifyPropertChangedます。私が抱えている問題は...wpfフォームが最初にロードされたときに設定ActiveStockし、setterとgetterの両方が呼び出され、データを正しく反映するようにuiが更新されたときです。
ただし、後でStockViewModel.ActiveStockを設定すると、FirePropertyChangedが呼び出されますが、ゲッターが呼び出されていないため、UIが更新されて新しいデータが反映されません。ここで何が起こっているのか考えてみませんか?

私が持っている2番目の質問は、変更されたときにモデルPropertyChangedの子プロパティ(PriceDataおよび)も上げる必要があるかどうかです。CompanyDataViewModel.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が変更されたときにコードビハインドでこれら2つのコントロールのDataContextを設定すると、正常に機能します。どうして???

4

2 に答える 2

3

私が見る限り、値を「取得」していないため、ゲッターは呼び出されていません。使用されるプロパティはPriceDataandのみでありCompanyData、これらは使用しませんINotifyPropertyChanged

に変更を反映させるには、クラスに実装する必要がINotifyPropertyChangedあります。StockUI

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 に答える
3

datacontext バインディングで mode プロパティを指定してみてください。

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

OneTime が DataContext の既定のバインドであるかどうかはわかりませんが、上記が役立つ場合はそのように説明されます。

2 番目の質問は、sa_ddam213 によって回答されています。

HTH

于 2013-02-17T23:27:43.200 に答える