Разные UpdateSourceTriggers для разных источников?

У меня есть WPF TextBox со свойством Text, связанным с источником данных. Я также связываю свойство IsEnabled второго TextBox со свойством Text.Length первого, чтобы отключить второе поле, когда в первом поле ничего не введено. Проблема в том, что я хочу, чтобы текстовый источник обновлялся при изменении свойства, но IsEnabled обновлялся только при потере фокуса, но я могу правильно определить только один UpdateSourceTrigger для текста.

Одним из способов решения этой проблемы является ручное включение и отключение текстовых полей для события потерянного фокуса предыдущих текстовых полей. Однако, поскольку существует множество этих текстовых полей, каждое из которых имеет 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}"/>

Здесь я хочу, чтобы свойство IsEnabled box2 обновлялось, когда box1 теряет фокус, а textSource1 обновлялось при изменении свойства Text в box1.

1 ответ

Решение

Вы можете использовать класс 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();
    }

}
Другие вопросы по тегам