ComboBox选择完成MVVM后强制绑定更新

时间:2014-12-03 15:23:08

标签: c# wpf mvvm binding combobox

我在使用可编辑的ComboBox和更新绑定时遇到了一些麻烦。目前我有一个ComboBox,其 UpdateSourceTrigger = LostFocus 这是因为我需要等待用户在我决定该值是否为新值之前完成输入内容(从而创建一个新值)。

不幸的是,我还有另一个功能,它要求绑定在值发生变化时进行更新。在这种情况下,Aka,LostFocus对我不好。在ComboBox中选择一个新值时,它不会导致LostFocus触发(显然)。所以我需要找到一种强制更新绑定的方法。

我查看了SelectionChanged并强制更新了绑定:

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

不幸的是, CAN NOT 此时更新绑定,因为值尚未更改。请参阅此stackoverflow主题:ComboBox- SelectionChanged event has old value, not new value

有一个技巧可以使用DropDownClosed事件,然后更新绑定,如果使用从不打开ComboBox的向上/向下箭头键,这种方法有效但不起作用。同时挂钩KeyUp和KeyDown还为时尚早。绑定无法更新。

所以我的问题是,什么时候该说&#34;嘿嘿先生Combo Box,你现在可以更新你的装订&#34;。

干杯。

1 个答案:

答案 0 :(得分:3)

您可以将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在获得焦点时也会被触发。

这是你想要的行为吗?