Die Benutzeroberfläche von MVVM Dynamic Menu kann nicht mit ViewModel gebunden werden

Ich arbeite mit einem Team an einer LoB-Anwendung. Wir möchten eine Dynamik habenMenu Steuerelement, das das Menü basierend auf dem angemeldeten Benutzerprofil erstellt. In früheren Entwicklungsszenarien (insbesondere ASP.NET) werden Daten durchlaufen, die die Erfassung und Generierung beschreibenMenuItem dynamisch. Wie würde ich das in MVVM machen? Kann ich die XAML-Ansicht von ViewModel trennen, in dem Menüelemente beschrieben werden?

Lösung:

Mit Beiträgen von Kommentatoren konnte ich bindenMenu dynamisch mit den Daten aus ViewModel. DieseArtikel war auch eine große Hilfe.

XAML:

<HierarchicalDataTemplate DataType="{x:Type self:Menu}" ItemsSource="{Binding Path=Children, UpdateSourceTrigger=PropertyChanged}">
    <ContentPresenter Content="{Binding Path=MenuText}" RecognizesAccessKey="True"/>
</HierarchicalDataTemplate>

[...]

<Menu Height="21" Margin="0" Name="mainMenu" VerticalAlignment="Top" HorizontalAlignment="Stretch" 
      ItemsSource="{Binding Path=MenuItems, UpdateSourceTrigger=PropertyChanged}" ItemContainerStyle="{StaticResource TopMenuItems}">
    <Menu.Background>
        <ImageBrush ImageSource="/Wpf.Modules;component/Images/MenuBg.jpg" />
    </Menu.Background>
</Menu>

Menu Datenklasse:

public class Menu : ViewModelBase
{
    public Menu()
    {
        IsEnabled = true;
        Children = new List<Menu>();
    }

    #region [ Menu Properties ]

    private bool _isEnabled;
    private string _menuText;
    private ICommand _command;
    private IList<Menu> _children;

    public string MenuText
    {
        get { return _menuText; }
        set
        {
            _menuText = value;
            base.OnPropertyChanged("MenuText");
        }
    }

    public bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            _isEnabled = value;
            base.OnPropertyChanged("IsEnabled");
        }
    }

    public ICommand Command
    {
        get { return _command; }
        set
        {
            _command = value;
            base.OnPropertyChanged("Command");
        }
    }

    public IList<Menu> Children
    {
        get { return _children; }
        set
        {
            _children = value;
        }
    }

    #endregion
}

Antworten auf die Frage(5)

Ihre Antwort auf die Frage