我想完成以下任务:
使用TreeView
显示CheckBoxes
资源(例如汽车,客房等)以选择项目或所有项目。
要做到这一点,我有Dictionary<ResourceCategory, List<Resource>>
用作TreeView's
ItemsSource
以及MultiBinding
中CheckBoxes
的{{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
仍未选中?
编辑:
CheckBox
和Add()
方法不起作用,但是当我分配一个包含旧选定资源集合的新Remove()
加上/减去我要添加/删除的那个时,它就可以了。但是我也可以使用普通ObservableCollection
...
答案 0 :(得分:1)
您遇到的一个问题是,您Dictionary
使用的ItemsSource
并未实施INotifyCollectionChanged
界面。另一个可能是您没有特定的数据类型类来实现包含所有所需属性的INotifyPropertyChanged
接口。
要解决此问题,请首先为实现INotifyPropertyChanged
接口的数据项定义正确的视图模型类,包括所需的所有所需的属性。然后,创建这些对象的ObservableCollection
并将 绑定到ListBox.ItemsSource
属性。然后,当您将项目添加到内部集合或进行任何属性更改时,您将按预期看到UI更新。