【问题标题】:How do I disable and enable comboBox in WPF based on some other process?如何基于其他进程在 WPF 中禁用和启用组合框?
【发布时间】:2021-10-21 01:14:56
【问题描述】:

我有一种情况,我必须在某些过程完成时抖动组合框。

此 sn-p 属于 Combo Box XAML (ItemSearchView.XAML)..

    <StackPanel Margin="2.5">
        <Label Content="{x:Static local:StringResources.LBL_FILL_LOC}" Target=" 
        {Binding ElementName=CboFillLoc}"/>
        <ComboBox x:Name="CboFillLoc" IsEnabled="{Binding IsComboEnabled}"
         ItemsSource="{Binding Locations}" SelectedItem="{Binding 
         SelectedLocation, Mode=TwoWay}" Padding="2.5"/>
    </StackPanel>

这是组合框需要在开始抖动并需要在结束时启用的方法。


    private async void FetchItems()
    {
        try
        {
             do something
        }
        catch
        {
    
        }
        finally
        {
    
        }
    
    }

这样做的目的是,每当用户手动搜索项目时,我必须限制用户执行其他进程,直到所有项目都正确加载。

我无法做到这一点,因为我对 WPF 很陌生。 任何建议或帮助都将不胜感激。

【问题讨论】:

  • 设置ComboBox 本身的IsEnabled 属性或源属性为false,就在您开始长时间运行的过程之前,然后在@987654327 中将其设置回true @块?

标签: c# wpf mvvm model-binding asp.net-mvc-viewmodel


【解决方案1】:

希望我正确理解了您的问题。您可以声明一个布尔属性并将其绑定到组合框的IsEnabled 属性。

例如,在您的 ViewModel 中

private bool _isComboEnabled;
public bool IsComboEnabled
{
  get=>_isComboEnabled;
  set
  {
    if(_isComboEnabled==value) return;
    _isComboEnabled = value;
    NotifyOfPropertyChanged();
  }
}

在 Xaml 中,您现在可以

<ComboBox x:Name="cboFillLoc" IsEnabled={Binding IsComboEnabled}.../>

现在每次您要调用SearchItemManually 方法时,您可以确保关闭 ComboEnabled 标志并在方法结束时再次打开它。

【讨论】:

  • 这非常有效。现在,当在流程结束时启用组合框时,焦点会从组合框中丢失。我应该设置 GotFocus = true 以重新获得焦点吗?还是有更好的焦点属性?
  • 您能否建议我一些关于如何在启用组合框后将焦点返回到组合框的想法?我尝试了 Focusable 和 gotFocus,但显然它不起作用。
  • 您需要调用一个名为 .Focus() 的方法。 GotFocus 是当您收到焦点时触发的事件
  • 嗨,我找不到任何组合框的 .Focus()。后面没有代码。我在这里错过了什么吗?请指导我。 ——
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多