ItemsControl 不显示项目
ItemsControl not showing items
自从我定期与 XAML 合作以来已经有一段时间了,我正在努力学习基础知识。
我正尝试在 ItemsControl
中显示项目,如下所示:
<DockPanel DockPanel.Dock="Left" Width="800">
<TextBlock DockPanel.Dock="Top" Text="{Binding ProfilePages.Count}"></TextBlock>
<Grid>
<ItemsControl ItemsSource="{Binding ProfilePages}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="Hello World" Height="100" Width="200" Background="AliceBlue"></TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</DockPanel>
ViewModel 非常基础:
public class XtmProjectViewModel : NotifyingObject
{
private ViewModelCollection<XtmProfilePageViewModel, XtmProfilePage> _profilePages;
public ViewModelCollection<XtmProfilePageViewModel, XtmProfilePage> ProfilePages
{
get { return _profilePages; }
set
{
_profilePages = value;
RaisePropertyChanged(() => ProfilePages);
}
}
public ViewModelCollection<XtmSearchPageViewModel, XtmSearchPage> SearchPages { get; }
public XtmProjectViewModel(XtmProject model)
{
ProfilePages = new ViewModelCollection<XtmProfilePageViewModel, XtmProfilePage>(model.ProfilePages, s => new XtmProfilePageViewModel(s));
SearchPages = new ViewModelCollection<XtmSearchPageViewModel, XtmSearchPage>(model.SearchPages, s => new XtmSearchPageViewModel(s));
ProfilePages.CollectionChanged += ProfilePages_CollectionChanged;
}
private void ProfilePages_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
Console.WriteLine("Test");
RaisePropertyChanged(() => ProfilePages);
}
}
ViewModelCollection
是一种自定义类型,它会自动与基础模型集合同步。我已经在所有类型的场景中使用它多年,没有任何问题。
但是,在视图中,项目没有显示,我得到了一个我无法解释的奇怪行为:
- 绑定到
ProfilePages.Count
的文本块按预期工作,即显示的数字是列表中的项目数。
- 没有绑定错误
ProfilePages
集合的 CollectionChanged
事件被正确触发
- 还在
CollectionChanged
事件处理程序中为整个集合 属性 添加 RaisePropertyChanged
事件不会改变行为
ProfilePages
属性 的 get 访问器在之前的场景中被调用了两次(触发 RaisePropertyChanged
)
- 当我在调试时编辑 XAML 时,有时项目会按预期显示在
ItemsControl
中。项目列表之后不会更新,但是
我无法解释这种行为,也不知道问题出在哪里。我已经检查了常见问题([=22= 的错误定义、缺少 CollectionChanged
事件、导致项目渲染不可见的布局错误等,但没有成功)。
如何解释这种行为?
如何修复?
应 OP 的要求,将我的评论移至答案,我们来了 15000 ;)
想知道您是否将对象插入到不在 UI 线程上的 ProfilePages 中。
自从我定期与 XAML 合作以来已经有一段时间了,我正在努力学习基础知识。
我正尝试在 ItemsControl
中显示项目,如下所示:
<DockPanel DockPanel.Dock="Left" Width="800">
<TextBlock DockPanel.Dock="Top" Text="{Binding ProfilePages.Count}"></TextBlock>
<Grid>
<ItemsControl ItemsSource="{Binding ProfilePages}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="Hello World" Height="100" Width="200" Background="AliceBlue"></TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</DockPanel>
ViewModel 非常基础:
public class XtmProjectViewModel : NotifyingObject
{
private ViewModelCollection<XtmProfilePageViewModel, XtmProfilePage> _profilePages;
public ViewModelCollection<XtmProfilePageViewModel, XtmProfilePage> ProfilePages
{
get { return _profilePages; }
set
{
_profilePages = value;
RaisePropertyChanged(() => ProfilePages);
}
}
public ViewModelCollection<XtmSearchPageViewModel, XtmSearchPage> SearchPages { get; }
public XtmProjectViewModel(XtmProject model)
{
ProfilePages = new ViewModelCollection<XtmProfilePageViewModel, XtmProfilePage>(model.ProfilePages, s => new XtmProfilePageViewModel(s));
SearchPages = new ViewModelCollection<XtmSearchPageViewModel, XtmSearchPage>(model.SearchPages, s => new XtmSearchPageViewModel(s));
ProfilePages.CollectionChanged += ProfilePages_CollectionChanged;
}
private void ProfilePages_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
Console.WriteLine("Test");
RaisePropertyChanged(() => ProfilePages);
}
}
ViewModelCollection
是一种自定义类型,它会自动与基础模型集合同步。我已经在所有类型的场景中使用它多年,没有任何问题。
但是,在视图中,项目没有显示,我得到了一个我无法解释的奇怪行为:
- 绑定到
ProfilePages.Count
的文本块按预期工作,即显示的数字是列表中的项目数。 - 没有绑定错误
ProfilePages
集合的CollectionChanged
事件被正确触发- 还在
CollectionChanged
事件处理程序中为整个集合 属性 添加RaisePropertyChanged
事件不会改变行为 ProfilePages
属性 的 get 访问器在之前的场景中被调用了两次(触发RaisePropertyChanged
)- 当我在调试时编辑 XAML 时,有时项目会按预期显示在
ItemsControl
中。项目列表之后不会更新,但是
我无法解释这种行为,也不知道问题出在哪里。我已经检查了常见问题([=22= 的错误定义、缺少 CollectionChanged
事件、导致项目渲染不可见的布局错误等,但没有成功)。
如何解释这种行为? 如何修复?
应 OP 的要求,将我的评论移至答案,我们来了 15000 ;)
想知道您是否将对象插入到不在 UI 线程上的 ProfilePages 中。