当前位置: 首页 > 知识库问答 >
问题:

WPF组合框在不应更改的情况下进行更改

孙星鹏
2023-03-14

我有一个雇主组合。选择雇主后,表格中会填入特定于雇主的数据:

        <ComboBox Name="EmployerListBox"
                  IsReadOnly="True"
                  ItemsSource="{Binding EmployerCollection, UpdateSourceTrigger=PropertyChanged}"
                  SelectedItem="{Binding SelectedEmployer, UpdateSourceTrigger=PropertyChanged}" 
                  Width="150" />

下面是它绑定到的属性和检查表是否脏的方法。如果表是脏的,则提示用户如果他们改变雇主,改变将丢失:

    /// <summary>
    /// Selected Employer
    /// </summary>
    public String SelectedEmployer
    {
        get
        {
            return _SelectedEmployer;
        }
        set
        {
            if (_SelectedEmployer != value && CanChangeEmployer())
            {
                _SelectedEmployer = value;
                NotifyPropertyChanged(m => m.SelectedEmployer);
                GetGarnishmentsTableView();
            }
        }
    }
    private String _SelectedEmployer = "";


    /// <summary>
    /// Method that executes each time user wants to change employers
    /// </summary>
    public Boolean CanChangeEmployer()
    {
        Boolean _returnValue = true;

        if (GarnishmentsTableIsDirty)
        {
            _returnValue = false;

            MessageBoxResult _change =
                MessageBox.Show("There are unsaved changes.  " +
                                "Changing Employers will lose any unsaved changes.  \n\n" +
                                "Are you sure you want to change Employers?", "Unsaved Changes", MessageBoxButton.YesNo);
            if (_change == MessageBoxResult.Yes)
            {
                // OK to switch employers
                _returnValue = true;
            }
        }

        return _returnValue;
    }

一切似乎都正常工作:

  • 用户选择更新表的雇主('KMH')。
  • 用户对表进行更改。
  • 用户然后选择不同的雇主('MPC')
  • 提示用户更改将丢失
  • 用户选择“否”并且Can火雇主返回“假”
  • 选择雇主不改变(跳过if{}块)

然而,在GUI中,雇主选项更改为用户选择的雇主(“MPC”),即使选择的雇主没有更改。

当我窥探组合框时,我看到组合框选定项正确设置为原始雇主(“KMH”),但“选定值”和“选择框项”都设置为新雇主(“MPC”)。

然后我试着绑定组合框-

        <ComboBox Name="EmployerListBox"
                  IsReadOnly="True"
                  ItemsSource="{Binding EmployerCollection, UpdateSourceTrigger=PropertyChanged}"
                  SelectedValue="{Binding SelectedEmployer, UpdateSourceTrigger=PropertyChanged}" 
                  Width="150" />

GUI是相同的,显示的公司不正确。但这次Snoop展示了ComboBox-

如何正确绑定SelectedEmployer,使GUI与选择的雇主匹配?

共有1个答案

卢阳成
2023-03-14

所发生的是组合框更改其选择,绑定更新视图模型,然后视图模型选择不更改其私有字段。但是,组合框应该如何知道更改被拒绝?你没有告诉我。

您可能会认为SelectedEmployer.set可以在决定保留旧值后简单地为选择雇主提高属性更改,但我无法使其工作。

执行此操作的“正确”方法是验证:让您的视图模型实现 IDataErrorInfo。这是一个教程,这是另一篇文章。通过验证,您的 IDataErrorInfo.this[propName].get 方法会在 ComboBox 接受新选择之前被调用,并被赋予拒绝新选择的选项。这就是你要找的。如果你不想要红色轮廓错误UI的东西,你可以摆弄模板来摆脱它。

尝试处理 SelectionChanged 很诱人,但事件参数没有 Cancel,因此您将 SelectedItem 设置回原来的状态,这会再次引发 SelectionChanged,因此您需要一些逻辑来阻止它无限递归。修复此问题后,由于初始选择完成,在将其设置回以前的值之前,仍然会出现可见的“闪烁”。就我个人而言,我更喜欢实现IDataErrorInfo的温和苦差事,而不是试图超越框架

这是我第一个想法的一个有点笨拙的变体,实际上有效。但是,它有同样的闪烁问题。远非理想,但它比验证工作少得多。DispatcherPriority.ApplicationIdle 是让它工作的原因:它等待实际执行 lambda,直到 ComboBox 中的选择更改事件的所有尘埃落定。DispatcherPriority.Background也对我有用。

 类似资料:
  • 如何在Angular 2应用程序中路由而不更改URL?(这是因为该应用程序位于Django应用程序页面上的几个选项卡之一下,其中适合保持URL不变。 目前我在里面有这样的东西 在<code>HomeComponent</code>中,用户页面的导航使用以下内容: 当我在Angular 2应用程序中导航时,可以保持网址不变吗?所以当用户在页面< code>user/123时,url将保持< code

  • 问题内容: 我需要在 不更改URL的情况下 进行路由。 在自己实现此功能之前,我尝试过通过React Router寻找一些东西。我看到有这样一个东西 : createMemoryHistory([options]) createMemoryHistory创建一个不与浏览器URL交互的内存历史对象。当您需要自定义用于服务器端呈现,自动测试的历史记录对象或不想操纵浏览器URL(例如,将应用程序嵌入到i

  • 我试图将文本字段“Colorbox0”的背景色更改为“Value0”,但它去掉了边框。 以下是我代码的简化版本: 非常感谢您的帮助 谢谢

  • 我有一个动作执行,其中一个if/fe是如果用户按“A”键,它会将文本设置为不同的内容。程序不是在按“A”后设置文本,而是跳过设置文本并向下移动到下面的if语句。我的问题是,如何让我的程序在我的if语句之前设置文本?我的代码在下面,谢谢!

  • 我有一堆CSV文件,它们是作为数据流读取的。对于每个dataframe,我希望更改一些列名,如果某个dataframe中存在特定列: column_name_update_map={'aa':'xx';'bb':'yy'}

  • 问题内容: 我想在字体为时使用光标。 那可能吗? 问题答案: 您可以定制一个。