UI未在ObservableCollection更改时更新

时间:2013-12-13 13:22:53

标签: c# wpf checkbox treeview observablecollection

我想完成以下任务:

使用TreeView显示CheckBoxes资源(例如汽车,客房等)以选择项目或所有项目。

要做到这一点,我有Dictionary<ResourceCategory, List<Resource>>用作TreeView's ItemsSource 以及MultiBindingCheckBoxes的{​​{1}},其中一个绑定到资源的ID,另一个绑定到所选资源DataTemplate

ObservableCollection< Resource>

我的问题是,当我在后面的代码中向所选资源集合添加资源对象时,其<TreeView Grid.Row="1" ItemsSource="{Binding Path=Category2ResourcesDictionary}" > <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Path=Value}"> <TextBlock Text="{Binding Path=Key}" /> <HierarchicalDataTemplate.ItemTemplate> <DataTemplate> <CheckBox Content="{Binding}" PreviewMouseDown="RessourcenTV_OnClick"> <CheckBox.IsChecked> <MultiBinding Converter="{StaticResource CheckBoxConverter}" UpdateSourceTrigger="PropertyChanged" NotifyOnSourceUpdated="True"> <Binding Path="ResourceId" Mode="OneWay" /> <Binding Path="SelectedResources" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" /> </MultiBinding> </CheckBox.IsChecked> </CheckBox> </DataTemplate> </HierarchicalDataTemplate.ItemTemplate> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> 仍然未被选中(未调用CheckBox方法), 但所选资源集合包含它。

为什么Convert仍未选中?

编辑: CheckBoxAdd()方法不起作用,但是当我分配一个包含旧选定资源集合的新Remove()加上/减去我要添加/删除的那个时,它就可以了。但是我也可以使用普通ObservableCollection ...

1 个答案:

答案 0 :(得分:1)

您遇到的一个问题是,您Dictionary 使用的ItemsSource并未实施INotifyCollectionChanged界面。另一个可能是您没有特定的数据类型类来实现包含所有所需属性的INotifyPropertyChanged接口。

要解决此问题,请首先为实现INotifyPropertyChanged接口的数据项定义正确的视图模型类,包括所需的所有所需的属性。然后,创建这些对象的ObservableCollection并将 绑定到ListBox.ItemsSource属性。然后,当您将项目添加到内部集合或进行任何属性更改时,您将按预期看到UI更新。