0

MVVM を実装しようとしていますが、ビュー モデルが変更されたときにビューが更新されません。これは私のビューモデルです:

public class ViewModelDealDetails : INotifyPropertyChanged
{
    private Deal selectedDeal;

    public Deal SelectedDeal
    {
        get { return selectedDeal; }
        set
        {
            selectedDeal = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

ビューの XAML には、次のようなものがあります。

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
       <StackPanel>
           <TextBlock Text="{Binding Path=SelectedDeal.Title, Mode=TwoWay}"></TextBlock>
       </StackPanel>
</Grid>

取引クラス:

public class Deal
{
    private string title;
    private float price;

    public Deal()
    {
        this.title = "Example";    
    }

    public Deal(string title, float price)
    {
        this.title = title;
        this.price = price;
    }

    public string Title
    {
        get { return title; }
        set { title = value; }
    }

    public float Price
    {
        get { return price; }
        set { price = value; }
    }
}

アプリケーションが開始されたときの値は正しいですが、SelectedDeal が変更されると、ビューは正しくありません。私は何が欠けていますか?

4

1 に答える 1

1

バインディングのパスはネストされています。これを機能させるには、DealクラスにINotifyPropertyChangedも実装する必要があります。それ以外の場合は、 SelectedDealが変更されない限りトリガーされません。ビューモデルをすべてBindableBaseから継承することをお勧めします。それはあなたの人生をずっと楽にするでしょう。

   public class ViewModelDealDetails: BindableBase
    {
        private Deal selectedDeal;

        public Deal SelectedDeal
        {
            get { return selectedDeal; }
            set { SetProperty(ref selectedDeal, value); }
        }

    }

    public class Deal: BindableBase
    {
        private string title;

        public string Title
        {
            get { return title; }
            set { SetProperty(ref title, value); }
        }
    }

上記のコードは機能するはずです。

ところで: Deal クラスのコードにアクセスできない場合、バインディングをトリガーするには、 Titleの値が変更されるたびにSelectedDealのインスタンスを再作成する必要があります。

于 2013-11-09T15:12:06.057 に答える