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
}

コンバーターは、アプリケーションがロードされたときに1回だけ呼び出されます。SelectedIndexが変更されても起動しません。

したがって、私の質問は、値コンバーターが起動する原因は何ですか?バインドされたデータが変更されたときだと思いますが、さまざまな状況でコンバーターを強制的に起動する方法はありますか?私も正しい質問をしていますか?

4

2 に答える 2

4

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

于 2009-08-05T16:44:27.900 に答える
2

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

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

于 2009-08-05T16:31:46.800 に答える