数据绑定和焦点协调

时间:2012-03-23 19:20:15

标签: wpf data-binding focus

我有几个控件,包括我想要禁用的DataGrid,直到演示文稿中的第一个TextBox中有一个有效值。所以我添加了一个布尔属性来绑定到VM中并在xaml(下面)中绑定它。

绑定有效,但具有在文本框(MoneyToAllocate)中“捕获”用户的副作用。

据推测,这是因为TB绑定是LostFocus,并且没有焦点去实际触发更新。有什么好办法解决这个问题?

干杯,
Berryl

视图模型

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);
    }
}

查看

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

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

修改

我应该补充一点,我尝试使用PropertyChanged进行更新,但由于文本框的值需要由转换器格式化,因此它有点乱。还有其他想法吗?

最终编辑

我让另一个以前不是标签的控件停在标签上,所以文本框有一个地方可以去。尽管用户可以输入的值范围(.001到decimal.MaxValue)使得上下不切实际,但菲尔最了解问题并获得答案。

2 个答案:

答案 0 :(得分:2)

使用UpdateSourceTrigger=PropertyChanged

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

答案 1 :(得分:1)

然后你必须使用UpdateSourceTrigger = PropertyChanged
- 如果使用该绑定,则使用VM中的值将不会生效,直到焦点从textBox移动为止 - 但是如果将UpdateSourceTrigger = PropertyChanged添加到绑定中,则VM属性(MoneyToAllocate)将立即生效(当textBox.Text值更改时)