MVVM Dynamique de Menu de l'INTERFACE utilisateur de se lier avec les ViewModel
Je travaille avec une équipe sur l'application Métier. Nous aimerions avoir une dynamique Menu
de contrôle, ce qui crée un menu basé sur le profil de l'utilisateur connecté. Dans les précédents scénarios de développement (à savoir ASP.NET nous utilisons pour itérer sur les données qui décrit la collecte et de générer des MenuItem
de façon dynamique. Dans MVVM comment puis-je faire? Puis-je séparer XAML vue de ViewModel qui décrit les éléments de menu?
Solution:
Avec les apports des commentateurs j'ai été en mesure de lier Menu
de façon dynamique avec les données de ViewModel. Cette l'article a été d'une grande aide aussi.
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
classe de données:
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
}
Après avoir passé quelque temps dans Google j'ai trouvé HierarchicalDataTemplate pourrait être utile dans la dynamique de création de menu, et pourtant distincte "préoccupations" avec le pattern MVVM. Je n'ai pas d'exemples de code encore 🙁
OriginalL'auteur Raj | 2009-09-08
Vous devez vous connecter pour publier un commentaire.
Essayer quelque chose comme cela:
Supposons que votre DataContext a une propriété appelée MenuItems qui est une liste de MenuItemViewModel. Quelque chose comme cela devrait fonctionner, alors:
Et aussi comment ai-je pu attribuer le style de XAML pour MenuItem comme ils ne sont pas explicitement défini dans le code XAML?
Styles à MenuItem peut être affectée à l'aide d'ItemContainerStyle propriété de Menu.
Je voudrais que cette réponse mieux si elle comprenait comment lier les commandes pour le menu!
Qu'en est
Separator
? Supposons que nous avons uneSeparator
modèle de la classe, comment pouvons-nous construire le menu avec des séparateurs?OriginalL'auteur Mark Seemann
Cela devrait vous rendre où vous allez
Noter que dans mon exemple, mon Élément de menu a une propriété de type ICommand appelé Commande.
OriginalL'auteur Adam Lenda
Cette solution n'a pas besoin de code dans le code derrière et qui le rend plus simple solution.
Et MenuItem est représentée comme:
Le béton MenuItems peut être instanciée directement ou vous pouvez faire votre propre sous-types par héritage.
OriginalL'auteur boskicthebrain
Je sais que c'est un vieux post mais j'ai besoin de ce plus comment lier les Commandes.
De Guge de la question sur la façon de lier les Commandes:
VMMenuItems est une propriété de mon point de vue de la classe du modèle de type
et le Menu est la catégorie définie ci-dessus. Le MenuItem de Commande de Propriété est lié à la Commande de la Propriété de la classe Menu.
De mon point de vue de la classe du modèle
où
Le xaml
OriginalL'auteur mike
Si vous vous demandez comment faire de séparateurs c'est vraiment très facile.
Le code ci-dessous est une partie de mon ViewModel. Depuis XAML utilise la réflexion tout ce que j'ai à faire est de retourner l '"objet" qui peut être un
MenuItemViewModel
,Separator
, ou (si, pour une raison bizarre j'ai besoin d') à unMenuItem
.Je suis en utilisant
yield
pour générer dynamiquement les éléments car il semble juste de lire mieux pour moi. Même si je suis en utilisantyield
- si les éléments de changement que j'ai encore besoin de lever unePropertyChanged
événement pour"ContextMenu"
comme d'habitude, mais je n'ai pas inutilement générer la liste jusqu'à ce qu'il est nécessaire.OriginalL'auteur Simon_Weaver