привязка данных и координация фокуса - PullRequest
0 голосов
/ 23 марта 2012

У меня есть несколько элементов управления, в том числе DataGrid, который я хочу отключить до тех пор, пока в первом TextBox в презентации не появится допустимое значение.Поэтому я добавил логическое свойство для привязки к виртуальной машине и привязки к нему в xaml (ниже).

Привязка работает, но имеет побочный эффект «захвата» пользователя в TextBox (MoneyToAllocate),

Предположительно, это связано с тем, что привязка к ТБ - это LostFocus, и фокусу нет места, чтобы запустить обновления.Какой хороший способ исправить это?

Ура,
Berryl

ViewModel

public bool HasMoneyToAllocate { get { return MoneyToAllocate.Amount > 0; } }

public Money MoneyToAllocate {
    get { return _moneyToAllocate; }
    set {
        if (value.Amount < 0) return;

        _moneyToAllocate = new Money(value.Amount, SelectedCurrency);
        NotifyPropertyChanged(() => HasMoneyToAllocate);
    }
}

View

    <TextBox Text="{Binding MoneyToAllocate, Converter={StaticResource moneyConverter}}"  />

    <DataGrid IsEnabled="{Binding HasMoneyToAllocate}" ...

EDIT

Мне следовало добавить, что я пытался обновить PropertyChanged, но он становится немного грязным, поскольку конвертер должен отформатировать значение текстового поля.Любые другие идеи?

FINAL EDIT

Я закончил, позволяя другому элементу управления, который ранее не был остановкой табуляции, быть табуляцией, поэтому текстовое поле было куда идти.Фил лучше всего понял проблему и получил ответ, даже если диапазон значений, которые пользователь может ввести (от .001 до десятичного. Макс. Значение), делает нецелесообразным повышение.

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Использование UpdateSourceTrigger=PropertyChanged

<TextBox 
    Text="{Binding MoneyToAllocate, UpdateSourceTrigger=PropertyChanged,
           Converter={StaticResource moneyConverter}}"  />
1 голос
/ 23 марта 2012

Тогда вы должны использовать UpdateSourceTrigger = PropertyChanged
- если вы используете эту привязку, вы используете значение в виртуальной машине, оно не будет изменено, пока фокус не сместится с textBox
- но если вы добавите UpdateSourceTrigger = PropertyChanged к вашей привязке, свойство VM (MoneyToAllocate) будет действовать немедленно (при изменении значения textBox.Text)

...