组合框选择完成后的强制绑定更新已完成 MVVM
本文关键字:绑定 更新 已完成 MVVM 选择 组合 | 更新日期: 2023-09-27 18:32:54
我在使用可编辑的组合框和更新绑定时遇到了一些问题。目前我有一个组合框,它的 UpdateSourceTrigger=LostFocus 这是因为我需要等待用户完成输入内容,然后才能决定该值是否为新值(从而创建一个新值(。
不幸的是,我还有另一个功能,当值更改时,绑定也需要更新。也就是说,在这种情况下,LostFocus对我没有好处。在组合框中选择新值时,它不会导致LostFocus触发(显然(。所以我需要找到一种方法来强制更新绑定。
我已经研究了选择更改并强制更新绑定:
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding ParentConversation.ViewModel.ComboSelectionChanged}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type controls:StoryForgeComboBox}}}"/>
</i:EventTrigger>
并像这样更新代码中的绑定:
be = BindingOperations.GetBindingExpression(ele, ComboBox.TextProperty);
if (be != null)
{
be.UpdateSource();
}
不幸的是,我目前无法更新绑定,因为值尚未更改。请参阅此堆栈溢出主题:组合框 - 选择已更改事件具有旧值,而不是新值
有一个技巧,您可以使用 DropDownClosed 事件,然后更新绑定,这有效,但如果您使用永远不会打开 ComboBox 的向上/向下箭头键,则不起作用。此外,连接到KeyUp和KeyDown还为时过早。绑定尚无法更新。
所以我的问题是,什么时候是说"嘿组合盒先生,您现在可以更新绑定"的好时机。
干杯。
您可以将
SelectionChanged
事件触发器更改为LostFocus
:
<ComboBox
IsEditable="True"
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}"
Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Triggers>
<i:EventTrigger
EventName="LostFocus">
<i:InvokeCommandAction
Command="{Binding Command}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
- 当用户键入时,
Text
将更新。 - 当用户键入并且
ComboBox
在Items
中找到匹配项时,SelectedItem
将更改。 - 当用户键入时,
ComboBox
找不到匹配项,并且之前选择了某个项目,SelectedItem
设置为null
。 - 当用户选择项目时,
SelectedItem
和Text
都会更新。 - 当用户离开
ComboBox
(失去焦点(时,将触发Command
。 - 当用户键入文本并打开下拉列表时,将触发
Command
。 - 编辑:奇怪的是,当它收到焦点时,
Command
也会被触发。
这是您想要的行为吗?