Связывание с выражением
Новое для WPF. У меня есть экранная цифровая клавиатура для ввода PIN-кода. Я хочу отключить кнопки, когда введены четыре цифры PIN-кода. Я, конечно, могу сделать это с кодом довольно легко, но мне кажется, что это должно быть сделано с привязкой.
Что-то вроде:
<Button Style="Whatever" IsEnabled={Binding ElementName=PinBox ???}/>
Кажется, что нет способа сделать это (что, честно говоря, кажется мне довольно примитивным). Поэтому я рассмотрел альтернативу, которая является простым свойством в базовом классе Window. Но я не уверен, как привязываться к нему (мне нужно указать сам класс как свой собственный контекст данных, или мне нужно извлечь строку PIN-кода в модель просмотра?)
И впоследствии, как мне получить свойство plain для обновления GUI.
Я полагаю, что я мог бы определить класс модели представления и иметь свойство зависимостей, называемое "ButtonsEnabled", но для такой простой проблемы он выглядит как тяжеловес.
Сообщите мне, если я что-то упустил.
Ответы
Ответ 1
Вы можете написать конвертер, который возвращает логическое значение в зависимости от цифр в TextBox
Кнопка XAML fo r будет
<Button Content="Test" IsEnabled="{Binding ElementName=PinBox,Path=Text,Converter={StaticResource DigitsToBoolConverter}}" Grid.Row="1" Height="20" Width="100"></Button>
где PinBox - это имя текстового поля, используемое для ввода PIN-кода.
Функция конвертера
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.ToString().Length >= 4;
}
Ответ 2
Другой способ: команды:
XAML:
<Button Content="2" Style="Whatever" Command={Binding MyCommand} CommandParamater="2"/>
ViewModel:
public ICommand MyCommand { get; private set; }
public string PinNumber { get; private set; }
public void Init()
{
MyCommand = new RelayCommand(
param => AddPinNumberDigit(param),
param => CanAddPin);
}
private void AddPinNumberDigit(string digit)
{
PinNumber += digit;
}
public bool CanAddPin {
get
{
return PinNumber.Length < 3;
}
}
Ответ 3
Нет, вы ничего не пропустили, WPF из коробки привязки не поддерживают выражения.
Некоторые люди внедряют свои собственные классы, которые добавляют этот тип функциональности:
http://www.11011.net/wpf-binding-expressions
Но на самом деле это то, для чего предназначен шаблон ViewModel. Используйте его, он не тяжеловес.
Ответ 4
Создайте converter, который вернет true или false на основе PinBox.Text.Length.
Затем ваш xaml станет:
<Button Style="Whatever" IsEnabled={Binding ElementName=PinBox, Converter={StaticResource yourConverter}}/>