2013-01-23 7 views
17

ich verbindlich die Itemssource meiner MenuItem zu einem ObservableCollection in meinem Viewmodel. Hier ist meine XAML:Wie kann ich MenuItems dynamisch binden und statisch hinzufügen?

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

Dieses Teil funktioniert großartig, aber jetzt auch ich möchte einige statische MenuItems auf die gleiche Ansicht MenuItem hinzufügen, mit einem Separator getrennt. So etwas, obwohl ich weiß, dass das nicht funktioniert, weil ich die Gegenstände nicht zweimal einstellen kann.

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

Denn jetzt habe ich eine Arbeit um erstellt eine andere Ebene der MenuItem wie folgt ergänzt:

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

Dies funktioniert gut, aber ich möchte lieber nicht ein Untermenü, wenn überhaupt möglich haben . Oh, und ich würde es auch lieber in XAML statt Code hinter machen. Irgendwelche Ideen?

+0

Vielleicht können Sie Composite verwenden, um "zu vereinigen" Ihre Sammlung von der VM mit Ihrer XAML-definierten Sammlung. –

Antwort

35

können Sie ein CompositeCollection dies zu tun, verwenden Sie verschiedene Sammlungen und fügen Sie statische Elemente in der XAML kombinieren.

Beispiel:

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

-Code

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

Ergebnis:

enter image description here

+0

Was sind die '{Binding Elementname = UI}' Sachen für? – Pyritie

+0

was, wenn ich Daten bin Bindung 'Menu' Itemssource (nicht eines seiner MenuItems)? Ich konnte den 'ItemContainerStyle' arbeitet nicht bekommen, weil ich gesetzt' Menu.ItemContainerStyle' und das ist falsch ... – JobaDiniz