2009-08-05 16 views
3

ListBoxのSelectedIndex> = 0であるかどうかに基づいて、コントロールのIsEnabledプロパティを設定しています。私はコードの背後でこれを行うことができますが、私は頻繁に行うことなので、この動作のためのバリューコンバータを作成したかったのです。値コンバータが起動する原因は何ですか?

私は、タスクを処理するために、この値コンバータを作成し、IsEnabledプロパティにそれをバインド:

[ValueConversion(typeof(Selector), typeof(bool))] 
public class SelectorItemSelectedToBooleanConverter : IValueConverter 
{ 
    #region IValueConverter Members 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null || !(value is Selector)) 
      return null; 

     var control = value as Selector; 
     return control.SelectedIndex >= 0; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

アプリケーションがロードされるとコンバータはのみ、一度呼び出されます。 SelectedIndexが変更されたときには発生しません。

私の質問は、バリューコンバータが起動する原因ですか?私はそれがバインドされたデータが変更されたときだと仮定します。そうすれば、さまざまな状況でコンバータを強制的に起動する方法がありますか?私は正しい質問をしていますか?

+0

xamlであなたのバインディングを表示できますか? SelectedIndexは依存関係プロパティであり、動作するはずです –

+0

バインドはSelectedIndexプロパティではなく、ListBox自体にあります。私はあなたが答えにヒットしたと思う:コントロール自体はdpではないので、おそらくコンテンツが変更されるたびにonylが働くだろう。 –

答えて

4

SelectorSelectedIndexプロパティではなく、Selectorにバインドしているため起動しません。 WPFはバインドするパスのすべてのプロパティを監視し、それらのプロパティのいずれかが変更された場合は値を更新します。 Selectorは変更されておらず、SelectedIndexです。

+0

上記ArsenMkrtのコメントを読むと、私は同じ結論に達しました。私はConverterを簡単に変更することができます:これはSelectorの型のいずれにも役立つだろうと思っていましたが、より説明的ですが、あなたが言うことは理にかなっています。 –

1

私はコンバータがこれについて間違った方法かもしれないと思います。よりよい解決策は、RoutedCommandのを使用することですし、コマンドのは、あなたのSelectedIndexをが0以上であるかどうかを確認するためにメソッドのチェックをCanExecuted

あなたはまだあなたの値を使用したい場合はそれくらい、言ってバインディングソースが更新されるたびにコンバーターが起動することがわかります。 BindingのUpdateSourceTriggerプロパティを使用して更新の動作を変更できます。デフォルトではPropertyChangedに設定されていますが、テキストボックスの場合はLostFocusに設定されています(テキストボックスのフォーカスが失われるたびにバインディングが更新されます)。

関連する問題