【发布时间】:2016-06-11 20:12:57
【问题描述】:
我正在尝试使用可观察集合中的 MVVM 来创建一个动态菜单项。一切正常,但我需要在最后添加一个“添加新”按钮。我找到了使用 CompositeCollection 的解决方案,如下所示:
How do I dynamically bind and statically add MenuItems?
因此有以下代码,其中 TimeSpan 是 ViewModel 的集合:
<MenuItem Header="Time Ranges">
<MenuItem.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding TimeSpans}" />
<Separator />
<MenuItem Header="Add New" cal:Message.Attach="NewTimeSpan()" />
</CompositeCollection>
</MenuItem.ItemsSource>
<MenuItem.ItemTemplate>
<ItemContainerTemplate>
<MenuItem Header="{Binding Name}" cal:Message.Attach="ConfigureTimeSpan()" />
</ItemContainerTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
但是,视图模型并没有像使用 ItemsSource="{Binding TimeSpan}" 那样填充,它没有显示任何内容:
我怀疑这是因为我在 StackOverflow 上面的答案绑定实际上是 MenuItems 的集合,所以复合集合是有意义的。而我的混合 ViewModels 和 MenuItems。
有什么方法可以在 XAML 中构造从 ViewModels 创建的菜单项集合,以便我可以绑定它?
【问题讨论】:
-
你试过了吗?
<MenuItem x:Name="TimeRangesMenuItem" Header="Time Ranges"><MenuItem.Resources><CollectionViewSource Source="{Binding ElementName=TimeRangesMenuItem, Path=TimeSpans}" x:Key="TimeSpans" /></MenuItem.Resources><MenuItem.ItemsSource><CompositeCollection><CollectionContainer Collection="{Binding Source={StaticResource TimeSpans}}" /><Separator /><MenuItem Header="Add New" cal:Message.Attach="NewTimeSpan()" /></CompositeCollection></MenuItem.ItemsSource>。就像在链接的答案中一样,使用资源。据我记得你需要CompositeCollection。 -
似乎得出了相同的结果。不过,我会更新问题中的 xaml,因为你是对的,我在另一个答案中完全错过了这一点。谢谢。
-
啊!知道了。路径需要是 DataContext.TimeSpans,因为 {Binding TimeSpans} 是我正在使用的 Caliburn.Micro MVVM 框架的捷径。非常感谢!
标签: c# wpf mvvm compositecollection