0

Text プロパティがデータ ソースにバインドされた WPF TextBox があります。また、最初のボックスに何も入力されていないときに 2 番目のボックスを無効にするために、2 番目の TextBox の IsEnabled プロパティを最初の Text.Length プロパティにバインドしています。問題は、プロパティが変更されたときにテキスト ソースを更新することですが、IsEnabled はフォーカスが失われたときにのみ更新する必要がありますが、テキストに対して適切に定義できる UpdateSourceTrigger は 1 つだけです。

これを回避する 1 つの方法は、前のテキスト ボックスのフォーカスが失われたイベントでテキスト ボックスを手動で有効または無効にすることです。ただし、これらのテキスト ボックスが多数あり、それぞれの IsEnabled が前のボックスの Text プロパティにバインドされているため、これは面倒です。Xamlでこれを行うためのよりクリーンな方法があるかどうか疑問に思っていました。

<TextBox Name="box1" Text="{Binding textSource1, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<TextBox Name="box2" IsEnabled="{Binding ElementName=box1, Path=Text.Length}" Text="{Binding textSource2, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>

ここでは、box1 がフォーカスを失ったときに box2 の IsEnabled プロパティを更新し、box1 の Text プロパティが変更されたときに textSource1 を更新します。

4

1 に答える 1

2

MultiBindingクラスを使用できます。

<TextBox Name="box2"  Text="{Binding textSource2, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Margin="321,64,113,217">
        <TextBox.IsEnabled>
            <MultiBinding  Converter="{StaticResource myConv}">
                <Binding ElementName="box1" Path="Text.Length" />
                <Binding ElementName="box1" Path="IsFocused" />
            </MultiBinding>
        </TextBox.IsEnabled>
</TextBox> 

次に、目的のカスタム ロジックを持つコンバーター クラスが必要です。

public class MyConverter : IMultiValueConverter
{

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int textLength = (int)values[0];
        bool isFocused = (bool)values[1];

        if (textLength > 0)
            return true;

        if (isFocused == true)
            return true;

        return false;
    }

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

}
于 2012-10-25T12:00:28.607 に答える