0

私のMainViewModel中には、ユーザーが設定したプロパティがあります。新しい値を受け取ったら、 my で情報を更新したいと思いUserControlます。問題は、バインディングが機能しないことです。私がそれを機能させたい方法は次のとおりです。SelectedDayが変更された後Day、ユーザー コントロール コード ビハインドのプロパティも変更され、メソッドが呼び出されCalculateDayます。ただし、このメソッドは呼び出されません。

理由は非常に単純で、バインドのメカニズムを完全には理解していないだけだと思いますが、何が問題なのか理解できず、本当に助けが必要です。すでに同様の質問をいくつか確認しましたが、適切な回答が見つかりませんでした。

私が持っているコード:

MainViewModel

private Day _selectedDay;
public Day SelectedDay
{
    get { return _selectedDay; }
    set
    {
        _selectedDay = value;
        RaisePropertyChanged("SelectedDay");
    }
}

メインウィンドウ XAML

<controls:DayControl Day="{Binding SelectedDay, Mode=TwoWay}"></controls:DayControl>

UserCotrol コード ビハインド

public Day Day
{
    get { return (Day)GetValue(DayProperty); }
    set
    {
        SetValue(DayProperty, value);
        CalculateDay();
    }
}

public static readonly DependencyProperty DayProperty =
    DependencyProperty.Register("Day", typeof(Day), typeof(DayControl), new PropertyMetadata(new Day()));
4

2 に答える 2

2

このmsdnによると

例外的な状況を除いて、ラッパーの実装はそれぞれ GetValue および SetValue アクションのみを実行する必要があります。この理由については、トピック「XAML の読み込みと依存関係のプロパティ」で説明しています。

代わりに、Dependency プロパティの定義で PropertyChangedCallBack を使用する必要があります。以下は、msdn から直接取得したコードです。

public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender, 
      new PropertyChangedCallback(OnUriChanged)
  )
);

上記のOnUriChangedの代わりにCalculateDayを定義します。

于 2013-05-19T17:18:39.667 に答える
0

DependencyPropertyコードビハインドで使用する理由がわかりません。に必要なものはすべて揃っていますMainViewModel

コード ビハインドでは、コンストラクターに追加するだけです。

this.DataContext = new MainViewModel(); 

次に、CalculateDayメソッドをに移動MainViewModelし、set メソッドで呼び出しますSelectedDay

于 2013-05-19T19:28:10.087 に答える