C# WPF:关闭项目选择上的组合框并显示消息框

C# WPF:关闭项目选择上的组合框并显示消息框,c#,wpf,combobox,C#,Wpf,Combobox,目标我在WPF中有Combobox,每当用户从Combobox中选择项目时,我都希望关闭Combobox(将旧值显示为选定值),并使用Ok/Cancel按钮显示MessageBox。如果用户单击“确定”,则应设置新的选定值,否则应返回 问题当我选择项目时,我能够显示消息框和打开的组合框,这是我不想要的。一旦用户选择某个内容,我就要关闭组合框并显示Messagebox 我怎么能做到 XMAL代码 <ComboBox Name="Currency" Grid.Row="1" Grid.Col

目标我在WPF中有Combobox,每当用户从Combobox中选择项目时,我都希望关闭Combobox(将旧值显示为选定值),并使用Ok/Cancel按钮显示MessageBox。如果用户单击“确定”,则应设置新的选定值,否则应返回

问题当我选择项目时,我能够显示消息框和打开的组合框,这是我不想要的。一旦用户选择某个内容,我就要关闭组合框并显示Messagebox

我怎么能做到

XMAL代码

 <ComboBox Name="Currency" Grid.Row="1" Grid.Column="5" ItemsSource="{Binding comboboxSource}"
                        SelectedValuePath="Value.bank_currency" IsReadOnly="False" IsTextSearchEnabled="True" TextSearch.TextPath="Value.bank_currency" 
                        SelectedItem="{Binding SelectedBankCurrency, UpdateSourceTrigger=LostFocus,Mode=Twoway}">

您可以跨越.Net线程池上的任务,并通过dispatcher显示消息框。

您可以在
SelectionChanged
事件上执行此操作

selectedItem
字段跟踪以前选择的项目,以便在没有货币变化时不会显示
MessageBox
。如果所选项目已更改,则会在显示
消息框之前隐藏下拉菜单。然后,如果用户单击“取消”,则会还原更改,否则会将当前选择存储在
selectedItem
中,以便将来进行比较

private object selectedItem = null;

private void Currency_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (Currency.SelectedItem == selectedItem)
        return;

    Currency.IsDropDownOpen = false;

    MessageBoxResult result = MessageBox.Show("Are you sure you want to change the currency?",
           "Warning",
           MessageBoxButton.OKCancel,
           MessageBoxImage.Question);

    if (result == MessageBoxResult.Cancel)
        Currency.SelectedItem = selectedItem;
    else
        selectedItem = Currency.SelectedItem;
}

if(result!=MessageBoxResult.Cancel)\u selectedCurrency=value
@Vyrira我已经试过了,但是这个组合框也没有关闭,并且与MessageBox重叠。你没有访问货币组合框的权限吗?您可以设置
Currency.IsDropDownOpen=false显示消息框之前。请使用
SelectionChanged
事件。我注意到您尚未将
IsEditable
设置为
True
,是否正在使用?如果没有,有一个简单的解决方案来实现你的目标。
  private void Combobox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (DataContext == null)
            return;
        var combo = (sender as ComboBox);

        if (combo != null && combo.IsDropDownOpen)
        {
            combo.IsDropDownOpen = false;
            var binding = combo.GetBindingExpression(ComboBox.SelectedItemProperty);

            binding.UpdateSource();
            binding.UpdateTarget();
        }
    }`
private object selectedItem = null;

private void Currency_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (Currency.SelectedItem == selectedItem)
        return;

    Currency.IsDropDownOpen = false;

    MessageBoxResult result = MessageBox.Show("Are you sure you want to change the currency?",
           "Warning",
           MessageBoxButton.OKCancel,
           MessageBoxImage.Question);

    if (result == MessageBoxResult.Cancel)
        Currency.SelectedItem = selectedItem;
    else
        selectedItem = Currency.SelectedItem;
}