2013-01-23 17 views
17

Impegno l'elemento ItemsSource del mio MenuItem su ObservableCollection nel mio ViewModel. Qui è la mia XAML:Come legare e aggiungere staticamente MenuItems in modo dinamico?

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

Questa parte funziona grande, ma ora voglio anche aggiungere alcuni MenuItems statico alla stessa vista MenuItem, separati da un separatore. Qualcosa di simile, anche se so che questo non funzionerà perché non posso impostare gli elementi due volte.

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

Per ora ho creato un lavoro in giro con l'aggiunta di un altro livello al MenuItem in questo modo:

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

Questo funziona bene, ma io preferirei non avere un sottomenu, se possibile . Oh, e preferirei farlo in xaml invece che nel codice. Qualche idea?

+0

forse è possibile utilizzare CompositeCollection a "unificare" la vostra raccolta dalla VM con la tua collezione definita XAML. –

risposta

35

È possibile utilizzare uno CompositeCollection per eseguire questa operazione, è possibile combinare raccolte diverse e aggiungere elementi statici in xaml.

Esempio:

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> 

Codice

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

Risultato:

enter image description here

+0

Che cosa sono le cose '{Binding ElementName = UI}'? – Pyritie

+0

Cosa succede se sto legando i dati 'Menu' ItemsSource (non uno dei suoi MenuItem)? Non sono riuscito a far funzionare 'ItemContainerStyle', perché ho impostato' Menu.ItemContainerStyle' e questo è sbagliato ... – JobaDiniz

Problemi correlati