我正在尝试使用来自可观察集合的MVVM创建动态菜单项。一切正常,但后来我需要添加一个“添加新”按钮到最后。我找到了一个使用CompositeCollection的解决方案,如下所示:
How do I dynamically bind and statically add MenuItems?
所以有以下代码,其中TimeSpans是ViewModels的集合:
<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 TimeSpans}”那样填充,它没有显示任何内容:
我怀疑这是因为我在上面的StackOverflow答案中绑定实际上是一个MenuItems的集合,因此复合集合是有意义的。而我的混合ViewModels&amp;的MenuItems。
有没有办法构建从XAML中的ViewModel创建的菜单项集合,以便我可以绑定它?
答案 0 :(得分:1)
对于遇到此问题的其他人,正如Szabolcs Dezsi所说,我需要为CollectionViewSource使用一个资源(我的阅读理解不好,因为我的问题中链接的答案就是这样)。
以下工作代码:
<MenuItem Header="Time Ranges" x:Name="TimeRangesMenuItem">
<MenuItem.Resources>
<CollectionViewSource Source="{Binding ElementName=TimeRangesMenuItem, Path=TimeSpans}" x:Key="TimeSpanMenuItems" />
</MenuItem.Resources>
<MenuItem.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource TimeSpanMenuItems}}" />
<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>