2011-12-19 20 views
4

ユーザーがフォームの保存ボタンをクリックしたときに明示的バインディングを使用してバインディングソースを更新するCheckBoxを含むモーダルポップアップがあります。WPF Explicit Bindingを使用しているときに保留中の変更を確認します。

<CheckBox Content="Default" IsChecked="{Binding Path=Unit.IsDefault, Mode=TwoWay, UpdateSourceTrigger=Explicit"/> 

は今、私は、ユーザーがそれをクリックした場合、私は保留中のバインディング更新があるかどうかを確認して、そうであれば、ユーザーにメッセージを表示したい、フォームにキャンセルボタンを追加します。

これはバインディングで可能ですか?誰もが明示的にまだ更新されていないバインディングへの変更を追跡する方法についての他の提案を持っているん

BindingExpression binding = cb.GetBindingExpression(CheckBox.IsCheckedProperty); 
binding.HasPendingUpdates(); // Anything similar to this? 

失敗:私のような何かを望んでいますか?

+0

を使用すると、ソース値と現在値を比較してみましたがありますか? – Rachel

+0

私はそれをやっていると考えていましたが、それでも必要な場合はできますが、時間と労力を節約する方法があるかどうかは疑問でした。 – Fermin

答えて

0

変換を使用することができます。 IsSuspendedプロパティとHasPendingChangesプロパティをコンバーターに追加します。 IsSuspendedがtrueの場合、コンバーターからBinding.DoNothing()を返し、コンバータ内でHasPendingChangesをtrueに設定します。それ以外の場合は元の値を返し、HasPendingChangesをfalseに設定します。

xamlでこのコンバータを宣言すると、IsSuspendedがtrueに設定されます。ユーザーがボタンをクリックすると、最初にHasPendingChangesをチェックし、IsSuspendedをfalseに設定してバインディングを更新します。更新後にIsSuspendedをtrueに戻します。

+0

プロパティの追加(IsSuspended + HasPendingChanges?)については、MultiValueConverterを意味していると思います。バインディングが更新されたときにのみコンバーターを使用しますか? – Fermin

0

defaultCheckBox.GetBindingExpression(CheckBox.IsCheckedProperty).IsDirty

+0

IsDirtyプロパティが.NET 4.5で追加されたようです... – Reyhn

1

Kurian氏が指摘したように、あなたが.NET 4.5を使用している場合は、BindingExpressionBaseのプロパティIsDirtyを使用することができます。

一方で、この問題を回避するには、リフレクションを使用して内部プロパティNeedsUpdateをチェックすることができます

public static bool IsDirty(this BindingExpression binding) 
{ 
    if (binding == null) 
     throw new ArgumentNullException("binding"); 

    var needsUpdateProperty = typeof(BindingExpressionBase).GetProperty("NeedsUpdate", BindingFlags.Instance | BindingFlags.NonPublic); 
    var isDirtyAsObject = needsUpdateProperty.GetValue(binding, null); 
    if (isDirtyAsObject is bool) 
     return (bool)isDirtyAsObject; 

    return false; 
} 
関連する問題