Подтвердить что ты не робот

Связывание с выражением

Новое для WPF. У меня есть экранная цифровая клавиатура для ввода PIN-кода. Я хочу отключить кнопки, когда введены четыре цифры PIN-кода. Я, конечно, могу сделать это с кодом довольно легко, но мне кажется, что это должно быть сделано с привязкой.

Что-то вроде:

<Button Style="Whatever" IsEnabled={Binding ElementName=PinBox ???}/>

Кажется, что нет способа сделать это (что, честно говоря, кажется мне довольно примитивным). Поэтому я рассмотрел альтернативу, которая является простым свойством в базовом классе Window. Но я не уверен, как привязываться к нему (мне нужно указать сам класс как свой собственный контекст данных, или мне нужно извлечь строку PIN-кода в модель просмотра?)

И впоследствии, как мне получить свойство plain для обновления GUI.

Я полагаю, что я мог бы определить класс модели представления и иметь свойство зависимостей, называемое "ButtonsEnabled", но для такой простой проблемы он выглядит как тяжеловес.

Сообщите мне, если я что-то упустил.

4b9b3361

Ответ 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}}/>