动态绑定和静态添加 MenuItems - 使用视图模型/MVVM [英] Dynamically binding and statically adding MenuItems - using view Models/MVVM

查看:62
本文介绍了动态绑定和静态添加 MenuItems - 使用视图模型/MVVM的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用来自可观察集合的 MVVM 来创建动态菜单项.一切正常,但后来我需要在最后添加一个添加新"按钮.我找到了一个使用 CompositeCollection 的解决方案,如下所示:

我怀疑这是因为我在 StackOverflow 回答上面绑定实际上是一个 MenuItems 的集合,所以复合集合是有意义的.而我的混合 ViewModels &菜单项.

有什么方法可以构造从 XAML 中的 ViewModel 创建的菜单项集合,以便我可以绑定它?

解决方案

对于遇到此问题的任何其他人,正如 Szabolcs Dezsi 所说,我需要为 CollectionViewSource 使用资源(我的阅读理解很差,因为那是在我的问题中链接的答案中).

以下工作代码:

<MenuItem.Resources><CollectionViewSource Source="{Binding ElementName=TimeRangesMenuItem, Path=TimeSpans}" x:Key="TimeSpanMenuItems"/></MenuItem.Resources><MenuItem.ItemsSource><复合集合><CollectionContainer Collection="{Binding Source={StaticResource TimeSpanMenuItems}}"/><分隔符/><MenuItem Header="新增" cal:Message.Attach="NewTimeSpan()"/></CompositeCollection></MenuItem.ItemsSource><MenuItem.ItemTemplate><ItemContainerTemplate><MenuItem Header="{绑定名称}" cal:Message.Attach="ConfigureTimeSpan()"/></ItemContainerTemplate></MenuItem.ItemTemplate></菜单项>

I'm trying to have a dynamic menu item using MVVM from an observable collection. Everything worked, but then I needed to add a "add new" button to the end. I found a solution using a CompositeCollection, like here:

How do I dynamically bind and statically add MenuItems?

So have the following code, where TimeSpans is a collection of 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>

However, the view models are not populated like it was just using ItemsSource="{Binding TimeSpans}", it's not showing anything:

I suspect this is because I'm in the StackOverflow answer above the binding is actually a collection of MenuItems, so that composite collection makes sense. Whereas mine's mixing ViewModels & MenuItems.

Is there any way to construct the collection of menu-items created from ViewModels in the XAML so I can bind it?

解决方案

For anyone else who comes across this, as Szabolcs Dezsi said, I needed to use a resource for the CollectionViewSource (bad reading comprehension on my part, as that was in the answer linked in my question).

Working code below:

<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>

这篇关于动态绑定和静态添加 MenuItems - 使用视图模型/MVVM的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆