2017-03-09 2 views
0

Der Versuch, einige MenuItems dynamisch zu einem vordefinierten <Menu>WPF dynamische MenuItems

XAML hinzuzufügen:

<Window x:Class="FSBEM.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:FSBEM" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:src="clr-namespace:FSBEM.Models" 
    mc:Ignorable="d" 
    Title="BEM" Height="471.997" Width="1186.374" 
    WindowStartupLocation="CenterScreen" 
    WindowState="Maximized" 
    Closing="Window_Closing" 
    Icon="/Media/Icons/AppL.ico"> 

    <Grid Name="MainGrid" FlowDirection="LeftToRight"> 
     <Menu Name="MainMenu" HorizontalAlignment="Stretch" Height="23 VerticalAlignment="Top" > 
     <MenuItem Name="M_1" Header="1"> 
       <MenuItem Name="M_2" Header="2"/> 
       <MenuItem Name="M_3" Header="3" /> 
     </MenuItem> 
     <MenuItem Name="M_Test" Header="Test"/> 
     </Menu> 
    </Grid> 
</Window> 

Code-Behind:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     MenuItem mItem1 = new MenuItem(); 
     mItem1.Name = "MenuItem1"; 
     mItem1.Header = "MenuItem1"; 
     M_Test.Items.Add(mItem1); 

     MenuItem mItem2 = new MenuItem(); 
     mItem2.Name = "MenuItem2"; 
     mItem2.Header = "MenuItem2"; 
     M_Test.Items.Add(mItem2); 
    } 
} 

und hier ist das Ergebnis:

enter image description here

Ich habe keine Ahnung, was das Problem ist. Irgendeine Hilfe!

UPDATE

Der Code kompiliert fein und gibt mir das Ergebnis in dem obigen Bild.

Note:

habe ich ein neues Projekt und den Code getestet. und es funktioniert gut !!

+0

ein komplettes Mindest Beispiel plz erstellen. – Steve

+0

hat den Beitrag aktualisiert. –

+1

Ihr Code wird nicht kompiliert, funktioniert aber gut, wenn Sie ihn reparieren. – vesan

Antwort

0

In Ihrem MainWindow.xaml, können Sie so etwas wie dieses haben ...

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

    <Grid DataContext="{Binding ElementName=mainwindow}"> 
     <Menu Height="24" VerticalAlignment="Top"> 
     <MenuItem Header="_View" > 
       <MenuItem Header="Windows"> 
        <MenuItem.ItemsSource> 
         <CompositeCollection> 
          <CollectionContainer Collection="{Binding Source={StaticResource MenuItems}}" />        
         </CompositeCollection> 
        </MenuItem.ItemsSource> 
        <MenuItem.ItemContainerStyle> 
         <Style> 
          <Setter Property="MenuItem.Header" Value="{Binding MenuItemName}"/> 
         </Style> 
        </MenuItem.ItemContainerStyle> 
       </MenuItem> 
      </MenuItem> 
     </Menu> 
    </Grid> 
</Window> 

Dann in mainwindow.xaml.cs, Sie so etwas wie dieses haben kann ...

public partial class MainWindow : Window 
{ 
    private ObservableCollection<MenuItem> _menuItems= new ObservableCollection<YourObj>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     MenuItems.Add(new MenuItem{ Title = "Menu Item 1" }); 
     MenuItems.Add(new MenuItem{ Title = "Menu Item 2" }); 
    } 

    public ObservableCollection<MenuItem> MenuItems 
    { 
     get { return _menuItems; } 
     set { _menuItems= value; } 
    } 
} 

public class YourObj 
{ 
    public string MenuItemName{ get; set; } 
} 
+0

Sie sollten erklären, wie und warum das funktioniert. –

+0

Meine Entschuldigung, zuerst in Ihrem Hauptfenster.xaml.cs, sollten Sie eine Observablecollection erstellen, die mehrere verschiedene Menüelemente darin enthalten; In unserem Fall haben wir MenuItems als Sammlung mit mehreren verschiedenen Menüpunkten. Dann können wir im xaml einfach an die observablecollection von MenuItems binden. Auf diese Weise müssen Sie nicht explizit mehrere Male in der XAML deklarieren, da sie bereits in den ObservableCollections MenuItems – user7583356

1

Sie haben alles richtig gemacht, es ist nur, dass Sie Ihr MenuItem mItem1 deklarieren, aber wenn Sie es verwenden, schreiben Sie mItem (Sie haben die 1 am Ende vergessen) das Gleiche für das zweite.

Dies ist, wie der Code sein sollte:

   MenuItem mItem1 = new MenuItem(); 
      mItem1.Name = "MenuItem1"; 
      mItem1.Header = "MenuItem1"; 
      M_Test.Items.Add(mItem1); 

      MenuItem mItem2 = new MenuItem(); 
      mItem2.Name = "MenuItem2"; 
      mItem2.Header = "MenuItem2"; 
      M_Test.Items.Add(mItem2); 
+0

sind, das war nicht das Problem. das war ein Fehler beim Kopieren und Einfügen. –

Verwandte Themen