【发布时间】:2017-01-09 16:03:43
【问题描述】:
我有一个组合框可以更改对象类型。选择新类型时,我会破坏旧视图模型并绑定到新视图模型。当我这样做时,组合框不再更新选定的项目属性。
组合框声明如下所示。请注意,此组合框位于 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>
失去绑定的属性如下所示。请注意,我没有调用 OnPropertyChanged,因为该类使用 Fody.PropertyChanged 包,并且该类标有 [ImplementsPropertyChanged]。
public MyType Type { get; set; }
{
get { return _type; }
set
{
if (_type == value) return;
_type = value;
OnMyTypeChanged?.Invoke(this, new MyTypeChangedEventArgs(_type));
}
}
类型改变的回调如下所示。
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;
}
第一次更改对象的类型时,视图模型会正确更新。之后更改组合框的选定项甚至不会调用属性的 Set 函数。不知何故,组合框保持其旧的绑定。
我的视图的 DataContext 在程序开始时在后面的代码中分配一次。上下文本身是一个单例管理器类,它执行视图模型的实际交换。初始化看起来像这样。否则不会更新。
public MainWindow()
{
InitializeComponent();
//Set the global DataContext
DataContext = MyTypeManager.Instance;
}
MyViewModels 属性在管理器类中声明为 observablecollection,如下所示:
public ObservableCollection<MyViewModel> MyViewModels { get; } = new ObservableCollection<MyViewModel>();
我在 Visual Studio 2015 中创建了一个测试应用程序,这里是存储库的链接。 https://github.com/df424/WFPComboBoxTest
【问题讨论】:
-
如何设置视图的
DataContext?请向我们提供minimal reproducible example。 -
我已经修改了帖子以包含有关 DataContext 设置位置的信息。
-
请发布 MyViewModels 属性
-
我用这部分更新了帖子。
-
@ghost 更改内容后不调用 CollectionChanged 事件。这可能会导致 UI 无法重新绑定到新实体。
标签: wpf