2016-09-02 3 views
0

バインド可能なプロパティのために二回呼び出されている:OnPropertyChangedを私はそうのようなバインド可能なプロパティを作成し、Xamarinフォームで

public static readonly BindableProperty SelectedItemProperty = BindableProperty.Create("SelectedItem", typeof(MyItem), typeof(MyGrid), default(MyItem)); 

public MyItem SelectedItem 
{ 
    get { return (MyItem)GetValue(SelectedItemProperty); } 
    set { SetValue(SelectedItemProperty, value); } 
} 

は、ここに私のコンストラクタです:

public MyView() 
{ 
    InitializeComponent(); 

    PropertyChanged += OnPropertyChanged; 
} 

protected void OnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) 
{ 
    if (propertyChangedEventArgs.PropertyName == "SelectedItem") 
    { 
     // called twice 
    } 
} 

プロパティ変更イベントである理由を誰かが説明することができます焼成2回?バインド可能なプロパティの定義に変更されたハンドラを作成すると、ハンドラはとなります。

public static readonly BindableProperty SelectedItemProperty = BindableProperty.Create("SelectedItem", typeof(MyItem), typeof(MyGrid), default(MyItem), null, SelectedItemChanged); 

私はこの問題がコードビハインドにのみ存在することに気付きました。 XAMLでプロパティを直接設定した場合、プロパティ変更イベントはに一度発生します。

答えて

2

この質問に確実に回答するのに十分な情報がありませんが、私は推測することができます。

SetValueメソッドが表示されていないと、私の前提は短絡がないことです。 "新しい値と古い値が同じであれば何もしない"。

次に、私の2番目の前提は、このプロパティにバインドされているコントロールがバインドされた後に設定されていることです。 SelectedItemがバインドされている場合、これはリストタイプのコントロールで発生します。

事象の結果としてチェーンのようなものかもしれません:

  1. コードプロパティ
  2. にPropertyChangedイベントが
  3. バインディングセットを発射される設定コントロールが、それは価値のレポートコントロール
  4. 上の値が変更されました、双方向バインドで再度ViewModelの値が設定される
  5. 短絡がないとPropertyChangedイベントが再び発生する
  6. それは財産だから(前と同じ値に)再び制御上のの
  7. 結合セット値
  8. コントロールは、変更を報告しない短絡されている適切

私の推測では、もしあなたのことですあなたのセッターを短絡させることでした(既存の値と照らし合わせて同じであれば救済する)、この動作は止まります。

関連する問題