none
Menu en MVVM RRS feed

  • Question

  • Bonjour à tous,

    J'essaie de réaliser un menu dynamique en MVVM. Je ne comprends pas pourquoi les commandes ne fonctionnent pas. Je joints la vue, le model et le viewmodel.

    Quelqu'un peut-il me donner un coup de main.

    Merci d'avance...

    La vue:

    <Window x:Class="Cuisine.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:Cuisine"
            xmlns:ViewModels="clr-namespace:Cuisine.ViewModels"
            xmlns:ControlzEx="clr-namespace:ControlzEx;assembly=MaterialDesignThemes.Wpf" 
            x:Name="WindowPrincipal" 
            mc:Ignorable="d"
            
            Title="MainWindow" 
            Height="450" 
            Width="800" 
            WindowStyle="None" 
            WindowStartupLocation="CenterScreen" 
            WindowState="Maximized"
            xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
            Background="{DynamicResource MaterialDesignPaper}"
            TextElement.Foreground="{DynamicResource MaterialDesignBody}">
    
        <Window.DataContext>
            <ViewModels:MainViewModel />
        </Window.DataContext>
    
        <Window.Resources>
            <Style x:Key="MenuStyle" TargetType="MenuItem" BasedOn="{StaticResource {x:Type MenuItem}}">
                <Setter Property="Icon" Value="{DynamicResource ResourceKey=Icone}"/>
                <Setter Property="Command" Value="{Binding CommandeMenu}" />
                <Setter Property="CommandParameter" Value="{Binding  ElementName=Text ,Path=Content}"/>
            </Style>
    
            <Image x:Key="Icone" Source="{Binding IconeSousMenu}" x:Shared="false"/>
        </Window.Resources>
    	
    	<Grid x:Name="GrdMenu" 
                  Background="#FFDCEDC8" 
                  Grid.ColumnSpan="2" 
                  Grid.Row="1" VerticalAlignment="Top" MaxHeight="30">
    
                    <Menu x:Name="MenuPrincipal"
                      IsMainMenu="True" 
                      Background="{x:Null}" 
                      Foreground="#FF9CCC65" 
                      FontFamily="Comic Sans MS" 
                      FontSize="12" 
                      ItemsSource="{Binding ItemMenu }" Margin="50,0,0,0">
                    <Menu.ItemTemplate>
                        
                        <HierarchicalDataTemplate ItemsSource="{Binding Path=ItemSousMenus}" 
                                                  ItemContainerStyle="{StaticResource MenuStyle}">
                            <TextBlock Text="{Binding NomMenu}" Height="30" Width="Auto"/>
                            <HierarchicalDataTemplate.ItemTemplate >
                                <DataTemplate>
                                    <TextBlock Text="{Binding NomSousMenu}">
                                    </TextBlock>
                                </DataTemplate>
                            </HierarchicalDataTemplate.ItemTemplate>
                            </HierarchicalDataTemplate>
                        </Menu.ItemTemplate>
    
    
                </Menu>
                
                    
            </Grid>

    Le model:

    namespace Cuisine.Models
    {
        public class ItemMenus : Notifiable
        {
            public ItemMenus()
            {
                //ItemSousMenu = new ObservableCollection<ItemSousMenu>(ServiceMenu.GetSousMenus(NomMenu));
            }
            private string nomMenu;
            public string NomMenu
            {
                set
                {
                    nomMenu = value;
                    RaisePropertyChanged(nameof(ItemMenus.NomMenu));
                }
                get
                {
                    return nomMenu;
                }
            }
    
            private ObservableCollection<ItemSousMenu> itemSousMenus;
            public ObservableCollection<ItemSousMenu> ItemSousMenus
            {
                set
                {
                    itemSousMenus = value;
                    RaisePropertyChanged(nameof(ItemMenus.ItemSousMenus));
                }
                get
                {
                    return new ObservableCollection<ItemSousMenu>(ServiceMenu.GetSousMenus(NomMenu));
                }
            }
        }
    }
    

    Le viewmodel:

    namespace Cuisine.ViewModels
    {
        public class MainViewModel : Notifiable
        {
            #region Constructeur
            public MainViewModel()
            {
                ItemMenu = new ObservableCollection<ItemMenus>(ServiceMenu.GetMenus());
            }
            #endregion
    
            #region ObservableCollection
            // Collection pour les menus
            private ObservableCollection<ItemMenus> itemMenu;
            public ObservableCollection<ItemMenus> ItemMenu
            {
                set
                {
                    itemMenu = value;
                    RaisePropertyChanged(nameof(MainViewModel.ItemMenu));
                }
                get
                {
                    return itemMenu;
                }
            }
    
            // Collection pour les commandes
            private BasicAction commandeMenu;
            public BasicAction CommandeMenu
            {
                set
                {
                    commandeMenu = value;
                    RaisePropertyChanged(nameof(MainViewModel.CommandeMenu));
                }
                get
                {
                    if (commandeMenu == null)
                    {
                        CommandeMenu = new BasicAction(param => Menu(param.ToString()));
                    }
                    return CommandeMenu;
    
                }
            }
            #endregion
    
            #region Méthodes
            private void Menu(string Titre)
            {
                string t = Titre;
            }
            #endregion
        }
    }
    

    mercredi 6 novembre 2019 12:00

Toutes les réponses

  • Bonjour,

    Pour que la communauté puisse vous aider au mieux possible, il sera utile de donner une erreur obtenue ou d'indiquer la ligne qui provoque le problème.

    Cordialement,
    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 7 novembre 2019 10:56
    Modérateur
  • Merci pour la réponse mais en fait il ne se passe rien. Quand je clique sur un sous menu le programme n'atteint pas la méthode Menu. Malheureusement je ne peut pas vous en dire plus.

    Par conséquent, à l'aide...

    jeudi 7 novembre 2019 17:59
  • Bonjour,

    Dans le code de viewmodel, pouvez-vous poser un point d'arrêt à la ligne " if (commandeMenu == null)" et après cela à la ligne  "CommandeMenu = new BasicAction(param => Menu(param.ToString()));" pour voir si le code s'exécute correctement?

    Cordialement,
    Nina

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    lundi 11 novembre 2019 13:37
    Modérateur