2017-03-06 25 views
0

子クラスがある親クラスがあります。どちらのクラスも、Template10を使用して変更通知をサポートしています。変更通知は各クラス内で動作します(つまり、同じクラス内のプロパティを更新する場合)が、子からの親に対して変更通知をトリガーすることはできません。RaisePropertyChangedは親に通知しません

public class ParentViewModel : ViewModelBase 
{ 
    public string ParentString { get } 
    public decimal? Net { get { return Total/(1 + TaxRate/100); } }   
    public decimal? Tax { get { return Total - Net; } } 
    decimal? _Total = default(decimal?); 
    public decimal? Total 
    { 
     get 
     { 
      return _Total; 
     } 
     set 
     { 
      Set(ref _Total, value); 
      RaisePropertyChanged(nameof(Net)); 
      RaisePropertyChanged(nameof(Tax)); 
     } 
    } 

    public ObservableCollection<ChildViewModel> MyChildren { get; set; } 

我々は我々がChildStringを持ってChildViewModel

Net { get { return Total/(1 + TaxRate/100); } } 

Tax { get { return Total - Net; } } 

を発射するParentViewModelRaisePropertyChangedを使用することができます見つけます。 ChildStringへの変更をParentStringに通知します。

public class ChildViewModel : ViewModelBase 
{ 
    ParentViewModel MyParent { get; set; } 
    string _ChildString = default(string); 
    public string ChildString 
    { 
     get 
     { 
      return _ChildString; 
     } 
     set 
     { 
      Set(ref _ChildString, value); 
      RaisePropertyChanged(nameof(this.MyParent.ParentString)); 
     } 
    } 

ParentStringは更新していません。 ChildStringが更新されると、どのようにしてParentStringを更新する必要がありますか?

+0

を割り当てthis.MyParent'ていますか?そしておそらく[このように質問](http://stackoverflow.com/questions/1427471/observablecollection-not-noticing-when-item-in-it-changes-even-with-inotifyprop)が助けてくれる –

+0

@Lei Yang MyParentが割り当てられている任意のメソッドがChildViewModelのインスタンスを作成します。リンクありがとうございました。受け入れられた答えは私たちのためのトリックです。 – Vague

答えて

1

nameof引数に関係なく、ChildViewModel.RaisePropertyChangedを呼び出すと、子ビューモデルでイベントが発生します。

nameofオペレータはイベントソースを「変更」できません。あなたはどういうわけか親PropertyChangedを発砲する方法が必要です。

public void RaiseParentStringChanged() 
{ 
    RaisePropertyChanged(nameof(ParentString)); 
} 

と子供からそれを呼び出す:最も簡単な方法はParentViewModelで適切なメソッドを作ることです

public string ChildString 
{ 
    get 
    { 
     return _ChildString; 
    } 
    set 
    { 
     Set(ref _ChildString, value); 

     // assuming, that parent is assigned at this point 
     MyParent.RaiseParentStringChanged(); 
    } 
} 

しかしParentStringの変更のみである場合には、子から親を捨てていいだろうその依存をもたらす理由。

MyChildrenは観測可能なコレクションなので、CollectionChangedイベントで登録できます。新しい子供が追加されると、PropertyChangedに登録し、ChildStringの変更が適切な親イベントを発生させるのを監視することができます。

それはこのようなものです: `

// non-related code is omitted 
public class ParentViewModel: ViewModelBase 
{ 
    private ObservableCollection<ChildViewModel> children; 

    public string ParentString { get; } 

    // don't do collection properties on view models 
    // as get-set ones, unless you know exactly what are you doing; 
    // usually you don't need to set them explicitly from outside 
    public ObservableCollection<ChildViewModel> MyChildren 
    { 
     get 
     { 
      if (children == null) 
      { 
       children = new ObservableCollection<ChildViewModel>(); 
       children.CollectionChanged += ChildrenChanged; 
      } 
      return children; 
     } 
    } 

    private void ChildrenChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     // assuming, that only two actions ("add" and "remove") are available; 
     // if you really need to nadle "reset" and "replace", add appropriate code; 
     // note, that "reset" doesn't provide acceess to removed items 
     switch (e.Action) 
     { 
      case NotifyCollectionChangedAction.Add: 
       ((ChildViewModel)e.NewItems[0]).PropertyChanged += ChildPropertyChanged; 
       break; 
      case NotifyCollectionChangedAction.Remove: 
       ((ChildViewModel)e.OldItems[0]).PropertyChanged -= ChildPropertyChanged; 
       break; 
     } 
    } 

    private void ChildPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == nameof(ChildViewModel.ChildString)) 
     { 
      RaisePropertyChanged(nameof(ParentString)); 
     } 
    } 
} 
+0

ありがとう@Dennis。子供コレクションの変更を購読する方法の例を教えてもらえますか? – Vague

+0

@Vague:答えを更新しました。 – Dennis

関連する問題