我有几个控件,包括我想要禁用的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)使得上下不切实际,但菲尔最了解问题并获得答案。
答案 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值更改时)