尽管编写
Winforms应用程序有些经验,但是WPF的“模糊”仍然使我在最佳实践和设计模式方面脱颖而出.
尽管在运行时填充了我的列表,但我的列表框显示为空.
我已经按照this helpful article的简单说明无效.我怀疑我丢失了一些DataBind()方法,我告诉listBox我修改了底层列表.
在我的MainWindow.xaml中,我有:
<ListBox ItemsSource="{Binding TopicList}" Height="177" HorizontalAlignment="Left" Margin="15,173,0" Name="listTopics" VerticalAlignment="Top" Width="236" Background="#0B000000"> <ListBox.ItemTemplate> <HierarchicalDataTemplate> <CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked}"/> </HierarchicalDataTemplate> </ListBox.ItemTemplate> </ListBox>
在我的代码隐藏中,我有:
private void InitializeTopicList( MyDataContext context ) { List<Topic> topicList = ( from topic in context.Topics select topic ).ToList(); foreach ( Topic topic in topicList ) { CheckedListItem item = new CheckedListItem(); item.Name = topic.DisplayName; item.ID = topic.ID; TopicList.Add( item ); } }
其中,通过跟踪,我知道正在填充四项.
编辑
我已经将TopicList更改为ObservableCollection.它仍然不起作用
public ObservableCollection<CheckedListItem> TopicList;
编辑#2
我做了两个更改,帮助:
在.xaml文件中:
ListBox ItemsSource="{Binding}"
在我填写列表后的源代码中:
listTopics.DataContext = TopicList;
解决方法
使用ObservableCollection<主题>而不是列表<主题>
编辑
它实现INotifyCollectionChanged接口,让WPF知道何时添加/删除/修改项目
编辑2
既然你在代码中设置了TopicList,它应该是一个依赖属性,而不是一个常见的字段
public ObservableCollection<CheckedListItem> TopicList { get { return (ObservableCollection<CheckedListItem>)GetValue(TopicListProperty); } set { SetValue(TopicListProperty,value); } } public static readonly DependencyProperty TopicListProperty = DependencyProperty.Register("TopicList",typeof(ObservableCollection<CheckedListItem>),typeof(MainWindow),new UIPropertyMetadata(null));
编辑3
查看项目的更改
>在CheckedListItem中实现INotifyPropertyChanged接口(每个setter都应该调用PropertyChanged(这个,新的PropertyChangedEventArgs(< property name as string>))event)>或从DependencyObject派生CheckedListItem,并将Name,ID,IsChecked转换为依赖属性>或更新它们(topicList [0] = new CheckedListItem(){Name = …,ID = …})