Как я динамически связываю и статически добавляю MenuItems?

Я привязываю ItemSource моего MenuItem к ObservableCollection в моей ViewModel. Вот мой xaml:

<menuitem header="_View" itemssource="{Binding Windows}">
 <menuitem.itemcontainerstyle>
 
 </menuitem.itemcontainerstyle>
</menuitem>

Эта часть отлично работает, но теперь я также хочу добавить некоторые статические объекты MenuItems в один и тот же элемент Menu View, разделенный разделителем. Что-то вроде этого, хотя я знаю, что это не сработает, потому что я не могу установить элементы дважды.

<menuitem header="_View" itemssource="{Binding Windows}">
 <menuitem.itemcontainerstyle>
 
 </menuitem.itemcontainerstyle>
 <separator>
 <menuitem header="item 1">
 </menuitem>
</separator></menuitem>

На данный момент я создал работу, добавив еще один уровень в MenuItem следующим образом:

<menuitem header="_View">
 </menuitem><menuitem header="Windows" itemssource="{Binding Windows}">
 <menuitem.itemcontainerstyle>
 
 </menuitem.itemcontainerstyle>
 </menuitem>
 <menuitem header="Load Layout">
 </menuitem>

Это отлично работает, но я бы предпочел не иметь подменю, если это вообще возможно. О, и я также предпочел бы сделать это в xaml вместо кода. Любые идеи?

1 ответ

Вы можете использовать CompositeCollection для этого, вы можете комбинировать различные коллекции и добавлять статические элементы в xaml.

Пример:

Xaml:

<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">
 </collectionviewsource></window.resources>
 <grid datacontext="{Binding ElementName=UI}">
 <menu height="24" verticalalignment="Top">
 <menuitem header="_View">
 </menuitem><menuitem header="Windows">
 <menuitem.itemssource>
 <compositecollection>
 <collectioncontainer collection="{Binding Source={StaticResource YourMenuItems}}">
 <menuitem header="Menu Item 1">
 </menuitem><menuitem header="Menu Item 2">
 </menuitem><menuitem header="Menu Item 3">
 </menuitem></collectioncontainer></compositecollection>
 </menuitem.itemssource>
 <menuitem.itemcontainerstyle>
 
 </menuitem.itemcontainerstyle>
 </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; }
}
</myobject></myobject></myobject>

Результат:

licensed under cc by-sa 3.0 with attribution.