Folgende Aufgabenstellung:

Eine XML soll die Daten für ein Menü bereitstellen. Das ganze ohne CodeBehind und unter MVVM.

Die XML sieht folgendermaßen aus:



  
    new.png
    Neu
  
  
    preferences.png
    Tools
  
  
    search.png
    Suche
  

Dazu habe ich als Model eine Klasse TopNavigationMenuItem erstellt mit lediglich zwei Propertys:

  public class TopNavigationMenuItem
  {
    public String MenuName { get; set; }  
    public String MenuImage { get; set; }  
  }

Anschliessend hab ich eine weitere Klasse in Models erstellt welche eine Methode enthält, die eine Liste von TopNavigationMenuItem zurück gibt. Hier benutze ich LINQ2XML um mir die Knoten heraus zu selektieren:

  
using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;

public class TopNavigationMenuItems
  {
    private static TopNavigationMenuItem navigationItem;
    private static List topNavigationMenuItemList = new List();

    public static List getTopNavigationItems()
    {
      var xmlPath = Path.GetDirectoryName(@"\Pfad\zur\TopNavigationItems.xml";
      var NavigationItems = XElement.Load(xmlPath);

      foreach (var item in NavigationItems.Elements())
      {
        navigationItem = new TopNavigationMenuItem();
        navigationItem.MenuName = (string)item .Element("MenuName");
        navigationItem.MenuImage = (string)item .Element("MenuImage");
        topNavigationMenuItemList.Add(navigationItem); 
      }
      return topNavigationMenuItemList;
    }
  }

Im ViewModel habe ich dann das ViewModelProperty TopMenuItems erstellt welche die Daten für die View in eine ObservableCollection bereitstellen soll.

    #region ViewModelProperty: TopMenuItems
    private ObservableCollection _topNavigationMenuItem = new ObservableCollection();
    public ObservableCollection TopMenuItems
    {
      get
      {
        return _topNavigationMenuItem;
      }

      set
      {
        _topNavigationMenuItem = value;
        OnPropertyChanged("TopMenuItems");
      }
    }
    #endregion

im Konstruktor von dem ViewModel wird dann die Liste aus dem Model der ObservableCollection zugewiesen:

    public TopMenuMainViewModel()
    {
      TopNavigationMenuItems.getTopNavigationItems().ForEach(x => TopMenuItems.Add(x));
    }

Und hier kommt der der Lamda Ausdruck zum Einsatz, den wir schon einmal Beachtung geschenkt haben.

Zum Schluss dann in der View noch die Daten an die ObservableCollection binden und in einem DataTemplate aufbereiten:


        
            
                
                
            
        
    

    
        

Fertig : )

MenuItems aus XML auslesen und binden – WPF / MVVM
Markiert in: