【发布时间】:2017-05-29 08:47:25
【问题描述】:
我有一个动态 WPF 输入表单,根据数据集合的内容显示输入文本框列表。每个文本框的文本都绑定到数据中的值字段,当这些字段中的任何一个发生更改时,我正在使用触发命令,然后使用输入字段的值在脚本(也动态提供)中执行计算。
我的问题是如何在字段值更改后执行命令。目前,我正在使用 TextChanged 属性基于事件触发器触发命令。
问题在于 TextChanged 属性似乎在设置绑定属性的值之前触发。这意味着尽管命令触发并执行脚本,但由于事件的顺序,当前正在编辑的字段仍将包含“旧”数据。
我正在使用的 XAML 代码的相关位是:
<Label Visibility="{Binding HasInputFieldsSection, Converter={StaticResource visibilityConverter}}">Input parameters</Label>
<ItemsControl Visibility="{Binding HasInputFieldsSection, Converter={StaticResource visibilityConverter}}"
ItemsSource="{Binding Path=SelectedQualificationType.QualificationTypeInputFields.QualificationTypeFields}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Label Content="{Binding Label}" Visibility="{Binding Label, Converter={StaticResource stringVisibilityConverter}}"/>
<TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged, Delay=250}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<cmd:EventToCommand Command="{Binding DataContext.ExecuteExpressionsCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我希望有一个不同的事件可以触发命令,但是在查看了 WPF 文本框的文档并尝试了一些替代方法之后,它们似乎都不合适。
我可以将绑定更改为基于 LostFocus 而不是 PropertyChanged,但为了更好的用户体验,我宁愿不这样做。同样,我可以消除输入 TextBox 绑定的延迟,但理想情况下,我希望保持这种延迟,再次为用户体验。
所以简而言之,当前的顺序似乎是:
- 用户输入内容
- 文本更改被触发
- 命令被触发
- 绑定字段得到更新
但我需要它更像:
- 用户输入内容
- 文本更改被触发
- 绑定字段得到更新
- 命令被触发
是否有更好的事件来触发或完成我想要做的事情?
【问题讨论】:
标签: c# wpf xaml events textbox