WPF组合框怪异行为

时间:2019-03-20 22:06:05

标签: c# wpf

我的组合框有问题。 我有两个窗口,LPO_Process和New_LPO。 LPO_Process将在显示New_LPO之前填充数据。我在New_LPO中有两个组合框,一个用于供应商,一个用于联系人。只要更改了供应商组合框项目,它将为联系人更新一项。

private void cb_Suppliers_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    cb_ContactPerson.DataContext = Database.LPO.Suppliers.SuppliersQuery.getContactPersonIdName(Convert.ToInt32(cb_Suppliers.SelectedValue));
    cb_ContactPerson.DisplayMemberPath = "Name";
    cb_ContactPerson.SelectedValuePath = "CPID";       
}

现在,我正在使用以下命令从LPO_Process加载数据:

     viewLPO.cb_Suppliers.SelectedValue = Convert.ToInt32((dt_LPO.Rows[0]["SID"].ToString()));
//MessageBox.Show("TEST");
viewLPO.cb_ContactPerson.Text = (dt_LPO.Rows[0]["ContactPersonID"].ToString());
viewLPO.Show();

使用调试,我可以看到传递的值是必需的值,但是当新窗口打开时,联系人字段为空。

现在很奇怪的部分是,如果我取消注释消息框,则会在窗口弹出之前显示一条消息,然后在接受之后,将在新窗口中填充该字段。

这可能是UI无法正确填充的问题,但是我尝试了几次更改,但没有任何效果。

关于如何进行的任何想法

XAML:

<ComboBox x:Name="cb_ContactPerson" HorizontalAlignment="Left" Margin="105,41,0,0" VerticalAlignment="Top" Width="279" ItemsSource="{Binding}" />

1 个答案:

答案 0 :(得分:1)

问题的可能原因可能是在事件处理程序中设置了DataContext,ItemsSource绑定重新评估可能在SelectionChanged事件完成后不久发生,从而导致在填充ItemsSource之前设置了Text属性。

添加MessageBox时,这将停止执行,直到您关闭MessageBox为止,这将使ItemsSource绑定有时间重新评估。

要查看此操作的实际效果,请在影响Text属性之前使用断点检查ItemsSource的值。另外,请考虑影响SelectedItem而不是Text属性。

编辑: @Joey在他的评论中是正确的,编辑了我的答案以突出显示可能的原因。当我说事件在另一个线程上运行时,我错了。