2013-01-23 31 views
17

MenüModumun ItemsSource'unu ViewModel'imdeki ObservableCollection öğesine bağlıyorum.MenuItems'i dinamik olarak nasıl bağlarım ve statik olarak ekleyebilirim?

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

Bu kısım inşaat büyük, ancak şimdi de ayırıcı ile ayrılmış aynı Görünüm Menuıtem bazı statik menuitems, eklemek istiyorum: İşte benim xaml olduğunu. Bunun gibi bir şey, biliyorum ki işe yaramaz, çünkü öğeleri iki kez ayarlayamıyorum.

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

Şimdilik böyle Menuıtem başka seviyesini ekleyerek etrafında bir işi yarattık: Bu iyi çalışır

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

, ama yerine eğer mümkünse bir alt menü olurdu değil . Ah, ve ben de bunu arkamda kod yerine xaml içinde yapmayı tercih ederim. Herhangi bir fikir?

+0

Belki "birleştirmek" için CompositeCollection kullanabilir.NEWLINENEWLINEKonum XAML tanımlı koleksiyonunuzla VM'den koleksiyon. –

cevap

35

Bunu yapmak için CompositeCollection'u kullanabilirsiniz, farklı Koleksiyonları birleştirebilir ve xaml'ye statik öğeler ekleyebilirsiniz.

Örnek:

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> 

Kod

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

Sonuç:

enter image description here

+0

'{Binding ElementName = UI}' nedir? – Pyritie

+0

'Menu' ItemsSource (MenuItems'lerinden biri değil) bağlanırken ne olur? 'ItemContainerStyle' 'ı çalıştıramadım çünkü' Menu.ItemContainerStyle' ayarlıyım ve bu yanlış ... – JobaDiniz

İlgili konular