如何动态绑定和静态添加 MenuItem? [英] How do I dynamically bind and statically add MenuItems?

查看:23
本文介绍了如何动态绑定和静态添加 MenuItem?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将 MenuItem 的 ItemsSource 绑定到 ViewModel 中的 ObservableCollection.这是我的 xaml:

I'm binding the ItemsSource of my MenuItem to an ObservableCollection in my ViewModel. Here is my xaml:

<MenuItem Header="_View"
          ItemsSource="{Binding Windows}">
  <MenuItem.ItemContainerStyle>
    <Style>
      <Setter Property="MenuItem.Header"
              Value="{Binding Title}" />
    </Style>
  </MenuItem.ItemContainerStyle>
</MenuItem>

这部分效果很好,但现在我还想将一些静态菜单项添加到同一个视图菜单项中,用分隔符分隔.像这样的东西,即使我知道这行不通,因为我不能设置项目两次.

This part works great, but now I also want to add some static MenuItems to the same View MenuItem, separated with a separator. Something like this, even though I know this won't work because I can't set the items twice.

<MenuItem Header="_View"
          ItemsSource="{Binding Windows}">
  <MenuItem.ItemContainerStyle>
    <Style>
      <Setter Property="MenuItem.Header"
              Value="{Binding Title}" />
    </Style>
  </MenuItem.ItemContainerStyle>
  <Separator />
  <MenuItem Header="item 1" />
  <MenuItem Header="item 2" />
</MenuItem>

现在我已经通过向 MenuItem 添加另一个级别来创建一个解决方法:

For now I have created a work around by adding another level to the MenuItem like this:

<MenuItem Header="_View">
  <MenuItem Header="Windows"
            ItemsSource="{Binding Windows}">
    <MenuItem.ItemContainerStyle>
      <Style>
        <Setter Property="MenuItem.Header"
                Value="{Binding Title}" />
      </Style>
    </MenuItem.ItemContainerStyle>
  </MenuItem>
  <MenuItem Header="Load Layout" />
  <MenuItem Header="Save Layout" />
</MenuItem>

这很好用,但如果可能的话,我宁愿没有子菜单.哦,我也更喜欢在 xaml 中执行此操作而不是隐藏代码.有什么想法吗?

This works fine, but I'd rather not have a sub menu if at all possible. Oh, and I'd also prefer to do this in xaml instead of code behind. Any ideas?

推荐答案

您可以使用 CompositeCollection 来做到这一点,您可以组合不同的 Collections 并在 xaml 中添加静态项.

You can use a CompositeCollection to do this, you can combine different Collections and add static items in the xaml.

示例:

XML:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="233" Width="143" Name="UI">
    <Window.Resources>
        <CollectionViewSource Source="{Binding ElementName=UI, Path=Windows}" x:Key="YourMenuItems"/>
     </Window.Resources>

    <Grid DataContext="{Binding ElementName=UI}">
        <Menu Height="24" VerticalAlignment="Top">
        <MenuItem Header="_View" >
                <MenuItem Header="Windows">
                    <MenuItem.ItemsSource>
                        <CompositeCollection>
                            <CollectionContainer Collection="{Binding Source={StaticResource YourMenuItems}}" />
                            <MenuItem Header="Menu Item 1" />
                            <MenuItem Header="Menu Item 2" />
                            <MenuItem Header="Menu Item 3" />
                        </CompositeCollection>
                    </MenuItem.ItemsSource>
                    <MenuItem.ItemContainerStyle>
                        <Style>
                            <Setter Property="MenuItem.Header" Value="{Binding Title}"/>
                        </Style>
                    </MenuItem.ItemContainerStyle>
                </MenuItem>
            </MenuItem>
        </Menu>
    </Grid>
</Window>

代码

public partial class MainWindow : Window
{
    private ObservableCollection<MyObject> _windows = new ObservableCollection<MyObject>();

    public MainWindow()
    {
        InitializeComponent();
        Windows.Add(new MyObject { Title = "Collection Item 1" });
        Windows.Add(new MyObject { Title = "Collection Item 2" });
    }

    public ObservableCollection<MyObject> Windows
    {
        get { return _windows; }
        set { _windows = value; }
    }
}

public class MyObject
{
    public string Title { get; set; }
}

结果:

这篇关于如何动态绑定和静态添加 MenuItem?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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