Разные 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();
}
}