2011-10-05 28 views
9
<Controls:MyControl Mode="Mode1" Value="{Binding Path=Something}" /> 

問題は、ListViewのデータテンプレートでこのコントロールを使用すると、バインディングが行われる前にバインディングが発生することです。バインディングの順序バインディングの順序を保証する方法

バリューバインディングの前にモードが常に設定されていることを確認するにはどうすればよいですか?

+0

。私は 'モード'もデフォルト値を持っていると思います。 'Mode'がnullでないときにバインディングを実行しますか? –

+0

Value Coercionのようなものがあなたにとって適切な解決策であるかもしれません。 – vcsjones

+0

@Meleak私はマウスではなく私のコントロールのModeプロパティについて話しています。問題は、Modeプロパティが設定される前にBindingが起こっていることです。そしてそれはコントロールの動作に影響します。モードを最初に設定したい。 Modeはデフォルト値を持っていますので、nullにはなりませんが、バインディングが発生する前にコントロールのモードを選択します。 – lahsrah

答えて

1

あなたができることはバインディングを遅らせることです。それでモード値がそれまで設定されていることを(ほとんど)確認することができます。 .net 4.5に遅延バインディングプロパティがあります。 はここ.NET 4.0 Delay property on Binding from .Net 4.5 in .Net 4.0

に、私は個人的にこの種の問題を解決することがかなり単純ですViewModelに(MVVM)、でそれを実装することをシミュレートする方法についての記事です。 ModeとSomethingの2つのプロパティを作成します。モードが変更されると、(INotifyPropertyChanged Interfaceを介して)「Something」プロパティも変更されたことをトリガーするはずです。

class MyViewModel : INotifyPropertyChanged 
    { 
    public event PropertyChangedEventHandler PropertyChanged; 

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

    private string _mode; 

    public string Mode 
    { 
     get { return _mode; } 
     set 
     { 
     _mode = value; 
     OnPropertyChanged("Mode"); 

     // OnPropertyChanged("Something"); 
     // or build up via a method: 
     // Something = DetermineFromMode(Mode); 
     } 
    } 

    private string _something; 

    public string Something 
    { 
     get { return _something; } 
     set 
     { 
     _something = value; 
     OnPropertyChanged("Something"); 
     } 
    } 
    } 
+0

遅延(.Net4.5)は、ターゲットからのソースの更新を遅らせたい場合に使用されますが、ここでは状況は逆です! –

1

コントロールのモードが設定されると、プロパティ "Something"のプロパティ変更イベントが発生しましたか?あなたはこのように制御し、あなたの「何か」プロパティを取得することができます -

Binding binding = BindingOperations.GetBindingExpression(this, this.Value).ParentBindingBase; 
String propertyToRefresh = binding.Path.Path; 

(this.DataContext as ViewModel).OnPropertyChange(propertyToRefresh); 

私はあなたのコントロールのDataContextのはINotifyPropertyChangedInterfaceを実装して、あなたのViewModelのインスタンスであると仮定しています。

ViemodelクラスのOnPropertyChangeメソッドがpublicでない場合や、コントロールのViewModelクラスへの参照がない場合。 (トーマス・レベスクにより示唆されるように)あなたは、単にこのようなあなたのBindingExpressionにUpdateTargetは()を呼び出すことができます - それはあなたが「マウスは常に前に設定されている」によって何を意味するかに依存し

BindingExpression binding = BindingOperations.GetBindingExpression(this, this.Value); 
binding.UpdateTarget(); 
+0

OnPropertyChangedは通常publicではありません。 BindingExpressionのUpdateTargetを呼び出すことで、バインディングを強制的に更新することをお勧めします。 –

+0

うん!!私は私の答えを更新しました。ありがとう、私はほとんどこの部分を逃した。 –

+0

私は、プロパティに変更されたイベントを使用することはできません.Modeプロパティに基づいて、値にバインドされているものはすべて破棄され、復旧できません。 – lahsrah