当父TabItem失去焦点时,ComboBox SelectedItem会发生更改

时间:2010-10-14 08:09:57

标签: wpf

我在TabItem中托管了一个ComboBox。当我从ComboBox中选择一个项目时,会填充一个合适的ListView。当我离开TabItem然后返回时,ComboBox中的SelectedItem为空,但ListView仍然正确填充。尚未引发SelectedItemChanged事件。

为什么返回查看时,ComboBox中未显示所选项目?

一些代码: 在视图---

             <ComboBox x:Name="customersComboBox"
                              ItemsSource="{Binding Path=Customers }"
                              SelectedItem="{Binding Path=SelectedCustomer, UpdateSourceTrigger=PropertyChanged}"
                              DisplayMemberPath="Code"
                              IsEditable="False">

在ViewModel中 -

    public ICustomerInfo SelectedCustomer
    {
        get { return (ICustomerInfo)GetValue(SelectedCustomerProperty); }
        set { SetValue(SelectedCustomerProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SelectedCustomer.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedCustomerProperty =
        DependencyProperty.Register("SelectedCustomer", typeof(ICustomerInfo), typeof(OrdersViewModel), new UIPropertyMetadata(null, SelectedCustomerChanged));

    private static void SelectedCustomerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d==null)
        {
            return;
        }
        OrdersViewModel viewModel = d as OrdersViewModel;
        if (e.NewValue == null)
        {
            return;
        }
        ICustomerInfo selectedCustomer = e.NewValue as ICustomerInfo;
        viewModel.SelectedCustomerChanged(selectedCustomer);
    }

    private void SelectedCustomerChanged(ICustomerInfo selectedCustomer)
    {
         if (selectedCustomer != null)
        {
            if (!GetOrders())
            {
                return;
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

我已经知道发生了什么。

当Tab失去焦点时,会引发SelectedItemChanged事件!我想我理解导致事件被引发的机制,但我不明白为什么它需要发生 - 显然它是“按设计”。

发生的事情是e.NewValue为null,我的代码没有更改为新值,但SelectedItem WAS设置为null。

编程错误,但TabItem(及其子控件)的奇怪行为让我感到沮丧!

答案 1 :(得分:0)

set EnabledViewState=true

然后发布一些代码,以便我能识别错误。