C# 用户界面未根据ObservableCollection更改进行更新
我想完成以下任务: 使用C# 用户界面未根据ObservableCollection更改进行更新,c#,wpf,checkbox,treeview,observablecollection,C#,Wpf,Checkbox,Treeview,Observablecollection,我想完成以下任务: 使用复选框显示资源(如汽车、房间等)的树状视图,以选择项目或全部项目 为此,我有一个字典,用作TreeView的项目资源 以及一个多重绑定,用于数据模板内的复选框,其中一个绑定到资源的Id,另一个绑定到所选资源可观察收集。 我的问题是,在代码隐藏中将资源对象添加到选定的资源集合时,其复选框仍处于未选中状态(未调用Convert方法), 但所选资源集合包含它 为什么复选框仍处于未选中状态 编辑: Add()和Remove()方法不起作用,但当我分配一个新的observed
复选框显示资源(如汽车、房间等)的树状视图
,以选择项目或全部项目
为此,我有一个字典
,用作TreeView的
项目资源
以及一个多重绑定
,用于数据模板
内的复选框
,其中一个绑定到资源的Id,另一个绑定到所选资源可观察收集
。
我的问题是,在代码隐藏中将资源对象添加到选定的资源集合时,其复选框
仍处于未选中状态(未调用Convert
方法),
但所选资源集合包含它
为什么复选框仍处于未选中状态
编辑:
Add()
和Remove()
方法不起作用,但当我分配一个新的observedcollection
时,它包含旧的选定资源集合加上/减去我想要添加/删除的资源集合,效果很好。但是我也可以使用一个普通的列表
。您的问题之一是,您用作项目资源的词典
没有实现INotifyCollectionChanged
接口。另一个可能是您没有实现包含所有必需属性的INotifyPropertyChanged
接口的特定数据类型类
要解决此问题,请首先为实现INotifyPropertyChanged
接口的数据项定义一个适当的视图模型类,包括它将需要的所有必需属性。然后,为这些对象创建一个ObservableCollection
,并将其绑定到ListBox.ItemsSource
属性。然后,当您向内部集合添加项或进行任何属性更改时,您将看到预期的UI更新
<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>