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