组合框选择完成后的强制绑定更新已完成 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还为时过早。绑定尚无法更新。

所以我的问题是,什么时候是说"嘿组合盒先生,您现在可以更新绑定"的好时机。

干杯。

组合框选择完成后的强制绑定更新已完成 MVVM

您可以将

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将更新。
  • 当用户键入并且ComboBoxItems中找到匹配项时,SelectedItem将更改。
  • 当用户键入时,ComboBox找不到匹配项,并且之前选择了某个项目,SelectedItem设置为 null
  • 当用户选择项目时,SelectedItemText都会更新。
  • 当用户离开ComboBox(失去焦点(时,将触发Command
  • 当用户键入文本并打开下拉列表时,将触发Command
  • 编辑:奇怪的是,当它收到焦点时,Command也会被触发。

这是您想要的行为吗?