更改视图模型时,WPF组合框将丢失与SelectedItem的绑定

更改视图模型时,WPF组合框将丢失与SelectedItem的绑定,wpf,Wpf,我有一个组合框,可以更改对象类型。选择新类型后,我将销毁旧视图模型并绑定到新视图模型。执行此操作时,组合框不再更新“选定项”属性 组合框声明如下所示。请注意,此组合框位于ListView的ItemTemplate中 <ListView ItemSource="{Binding MyViewModels}"> <ListView.ItemTemplate> <DataTemplate DataType="viewModels:MyTypeVie

我有一个组合框,可以更改对象类型。选择新类型后,我将销毁旧视图模型并绑定到新视图模型。执行此操作时,组合框不再更新“选定项”属性

组合框声明如下所示。请注意,此组合框位于ListView的ItemTemplate中

<ListView ItemSource="{Binding MyViewModels}">
    <ListView.ItemTemplate>
        <DataTemplate DataType="viewModels:MyTypeViewModel">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Type:" Width="170"/>
                <ComboBox  SelectedItem="{Binding Type}"
                                          ItemsSource="{Binding Source={StaticResource MyEnumTypes}}"
                                          Width="150"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
类型更改的回调如下所示

    private void OnMyTypeChanged(object sender, MyTypeChangedEventArgs args)
    {
        var index = MyViewModels.IndexOf(sender as MyViewModel);

        var selected = SelectedMyViewModel == MyViewModels[index]; 

        var tmp = CreateReplacementViewModelByType(args.Type, MyViewModels[index].Model.Address);

        if (selected)
            SelectedMyViewModel = tmp;

        MyViewModels[index] = tmp;

        MyViewModels[index].OnMyTypeChanged += OnMyTypeChanged;
    }
第一次更改对象类型时,viewmodel将正确更新。在此之后,更改组合框的选定项甚至不会调用属性的Set函数。不知何故,组合框保持了它原来的绑定

我的视图的DataContext在程序开始时在代码隐藏中分配一次。上下文本身是一个单例管理器类,用于实际交换视图模型。初始化过程如下所示。否则不会更新

    public MainWindow()
    {
        InitializeComponent();

        //Set the global DataContext
        DataContext = MyTypeManager.Instance;
    }
MyViewModels属性在manager类中声明为observablecollection,如下所示:

    public ObservableCollection<MyViewModel> MyViewModels { get; } = new ObservableCollection<MyViewModel>();
公共ObservableCollection MyViewModels{get;}=new ObservableCollection();
我已经在visual studio 2015中创建了一个测试应用程序,这里有到存储库的链接

要绑定到枚举数据源,首先添加一个ResourceDictionary,其中包含以下内容

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:utility="clr-namespace:MyApp;assembly=MyApp">
  <ObjectDataProvider x:Key="MyEnumTypesSource" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
    <ObjectDataProvider.MethodParameters>
      <x:Type TypeName="MyApp:MyEnumTypes" />
    </ObjectDataProvider.MethodParameters>
  </ObjectDataProvider>
</ResourceDictionary>

如何设置视图的
DataContext
?请向我们提供一个。我已修改了帖子,以包含有关DataContext设置位置的信息。请发布MyViewModels属性我使用此部分更新了帖子。@ghost更改内容后,您不会调用CollectionChanged事件。这可能会导致UI无法重新绑定到新实体。嗨,bic,谢谢你的回复。枚举将按预期作为选项显示在组合框中。反映财产的当前状态也没有问题。当我切换视图模型时,问题就出现了。完成此操作后,在组合框中选择新值将不再调用Type属性的set函数。有趣的是,我没有包含的类中还有其他属性仍然正确更新。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:utility="clr-namespace:MyApp;assembly=MyApp">
  <ObjectDataProvider x:Key="MyEnumTypesSource" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
    <ObjectDataProvider.MethodParameters>
      <x:Type TypeName="MyApp:MyEnumTypes" />
    </ObjectDataProvider.MethodParameters>
  </ObjectDataProvider>
</ResourceDictionary>
<Window.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="/Resources/EnumDataSources.xaml" />
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Window.Resources>
<ComboBox Height="24" Width="100" ItemsSource="{Binding Source={StaticResource MyEnumTypesSource}}"
    SelectedValue="{Binding MyViewModel.MyCurrentEnumValue}" />
public MyApp.MyEnumTypes MyCurrentEnumValue
{
    get { return m_MyCurrentEnumValue; }
    set
    {
        m_MyCurrentEnumValue = value;
        OnPropertyChanged("MyCurrentEnumValue");
    }
}