【问题标题】:Dynamically binding and statically adding MenuItems - using view Models/MVVM动态绑定和静态添加 MenuItems - 使用视图模型/MVVM
【发布时间】: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 创建的菜单项集合,以便我可以绑定它?

【问题讨论】:

  • 你试过了吗? &lt;MenuItem x:Name="TimeRangesMenuItem" Header="Time Ranges"&gt;&lt;MenuItem.Resources&gt;&lt;CollectionViewSource Source="{Binding ElementName=TimeRangesMenuItem, Path=TimeSpans}" x:Key="TimeSpans" /&gt;&lt;/MenuItem.Resources&gt;&lt;MenuItem.ItemsSource&gt;&lt;CompositeCollection&gt;&lt;CollectionContainer Collection="{Binding Source={StaticResource TimeSpans}}" /&gt;&lt;Separator /&gt;&lt;MenuItem Header="Add New" cal:Message.Attach="NewTimeSpan()" /&gt;&lt;/CompositeCollection&gt;&lt;/MenuItem.ItemsSource&gt;。就像在链接的答案中一样,使用资源。据我记得你需要CompositeCollection
  • 似乎得出了相同的结果。不过,我会更新问题中的 xaml,因为你是对的,我在另一个答案中完全错过了这一点。谢谢。
  • 啊!知道了。路径需要是 DataContext.TimeSpans,因为 {Binding TimeSpans} 是我正在使用的 Caliburn.Micro MVVM 框架的捷径。非常感谢!

标签: c# wpf mvvm compositecollection


【解决方案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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 2013-01-07
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多