2016-08-08 13 views
0

したがって、2つの変数、リストと日付時刻を含むモデルがあります。私のUserControlにはDependencyPropertyがあり、PropertyChangedCallbackも定義しました。私のフォームでプロパティ変更イベント実際に変更されていないときのイベント

public static readonly DependencyProperty MyProperty = DependencyProperty.Register("My", typeof(List<MyContainer>), typeof(UC), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnMyProperty))); 

public List<MyContainer> My 
{ 
    get 
    { 
     return GetValue(MyProperty) as List<MyContainer>; 
    } 
    set 
    { 
     SetValue(MyProperty, value); 
    } 
} 
private static void OnMyProperty(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    UC control = d as UC; 
    //do stuff 
} 

(DateTimeの上の)他のモデル変数の変更を行うボタンが、そこにあります。

private void Date_Click(object sender, RoutedEventArgs e) 
{ 
    MyModel model = DataContext as MyModel; 
    if (model != null) 
    { 
     model.Date = model.Date.AddDays(1); 
    } 
} 

最後に私のモデルです。

public class MyModel : INotifyPropertyChanged 
{ 
    private List<MyContainer> _My; 
    private DateTime _Date; 

    public MyModel() 
    { 
     _Date = DateTime.Now.Date; 
     _My = new List<MyContainer>(); 
    } 

    public List<MyContainer> My 
    { 
     get 
     { 
      return _My; 
     } 
     set 
     { 
      _My = value; 
      OnPropertyChanged("My"); 
     } 
    } 

    public DateTime Date 
    { 
     get 
     { 
      return _Date; 
     } 
     set 
     { 
      _Date = value; 
      OnPropertyChanged("Date"); 
      OnPropertyChanged("My"); 
     } 
    } 

    #region INotifyPropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 
} 

XAML宣言は以下のとおりです。私は実行を打った後

<local:UC My="{Binding My}" /> 

だから私の問題は、私がボタンを押した場合それは、それがうまくDateTimeプロパティを変更した後、それは、一度OnMyPropertyを発射、ですが、OnMyPropertyコールバックは再び発射しません。しかし、このようなモデルを変更すると、ボタンを押すたびにそれが発生することに気づきました。

public DateTime Date 
{ 
    get 
    { 
     return _Date; 
    } 
    set 
    { 
     _Date = value; 
     _My = new List<MyContainer>(_My); //added 
     OnPropertyChanged("Date"); 
     OnPropertyChanged("My"); 
    } 
} 

その変更なしに2番目の動作をどのようにトリガーできますか?

答えて

0

答えはあなたがこれを行う必要はほとんどないということです。フレームワークを本当にしたくないことをどうやって行うのかという質問をするときは、いつもと言ってください。あなたはそれを行う必要があると思います。。他の誰もがすでに使用しているはるかに簡単な答えがある可能性は非常に高いです。

コントロールにバインドした唯一のものはMyです。したがって、Myが変更されていない場合、コントロールの状態は変更されるべきではありません。 Dateが変更されたときにコントロールの状態を変更する場合は、コントロールの一部のプロパティにDateをバインドします。 コントロールがどのビューモデルからも情報を取得する方法は、その依存プロパティの1つをviewmodelのプロパティにバインドすることです。

コントロールは、そのプロパティの値を提供しているユーザーまたは何が何であるかを知ってはいけません。それは与えられたプロパティ値だけを知って仕事をすることができるはずです。

Myの内容が変更された場合 - あなたが項目を追加した、または削除した - もちろん、あなたがそれを拒否したため、コントロールはそれを知る方法がありません。新しいリストがあると言っているだけです。それはチェックして、それがまだ同じ古いリストを持っていると見て、あなたを無視します。ビューモデルのMyプロパティはObservableCollectionである必要があります。これは、コレクション内のアイテムを追加または削除するときにコントロールに通知するためです。

UIに表示されている間にそのプロパティを変更できるようにするには、アイテムそのもの(MyContainerクラス)にINofityPropertyChangedも実装する必要があります。

コントロールの依存プロパティMyは、List<T>である必要がありません。おそらくItemsControl.ItemsSourceのようなタイプobjectである必要があります。次に、コントロールテンプレートは、それをどうするかを知っているItemsControlに表示することができます。上記のようにObservableCollectionがバインドされている場合は、ItemsControlが自動的に更新されます。

private static void OnMyProperty(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    UC control = d as UC; 

    if (e.NewValue is INotifyCollectionChanged) 
    { 
     (e.NewValue as INotifyCollectionChanged).CollectionChanged += 
      (s, ecc) => { 
       // Do stuff with UC and ecc.NewItems, ecc.OldItems, etc. 
      }; 
    } 
} 
1

DependencyPropertyの値を設定すると、新しい値が古い値と異なるかどうかが最初に確認されます。この場合に登録したPropertyChangedCallbackメソッドは、DependencyPropertyと呼ばれます。したがって、プロパティ名が変更されましたが理にかなっています。

あなたの(変更されていない)ケースでは、MyDateのみ)を変更しようとしていません。したがって、コールバック関数を呼び出す理由はありません。

+0

すべての権利が、イベントマイや日付の変更を発射し、私の場合のために、適切なシナリオです:OnMyPropertyでは、あなたのコントロールクラスは、それが観察コレクションも同様だかどうかを確認することができますか? –

+0

たとえば、 'OnMyProperty'と' Date_Click'の両方から新しい関数 'OnChange'を呼び出すことができます。たぶん最善の方法ではないかもしれませんが、私はあなたのアーキテクチャと目的について十分に分かりません。それはあなたが変化に反応したいのはどこで、そしてなぜそれを望んでいるのかによって異なります。 – Fratyx

関連する問題