Jestem nowy w WPF i MVVM. Pracuję z zespołem w aplikacji LoB. Chcielibyśmy mieć kontrolkę dynamiczną Menu
, która tworzy menu na podstawie zalogowanego profilu użytkownika. W poprzednich scenariuszach rozwoju (mianowicie ASP.NET) używamy do iteracji poprzez dane, które opisują gromadzenie i dynamiczne generowanie MenuItem
. W MVVM jak mam to zrobić? Czy mogę oddzielić widok XAML od ViewModel, który opisuje elementy menu?Dynamiczny interfejs użytkownika MVVM od wiązania z ViewModel
Rozwiązanie:
z wejściami z komentatorów ja byliśmy w stanie związać Menu
dynamicznie z danymi z ViewModel. Ta article również była bardzo pomocna.
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
klasa dane:
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
}
Po spędzeniu trochę czasu w Google, stwierdziłem, że HierarchicalDataTemplate może być pomocny przy tworzeniu dynamicznego menu, a jednocześnie oddziela "obawy" od wzorca MVVM. Nie mam jeszcze próbek kodu :( – Raj