WPF MenuItem: Mix Data Elements and Static Content

I would like to create an MRU menu that has the following structure:

File +=>Recent Files +=> Doc1.txt +=> Doc2.txt -separator- +=> Clear entries 

This is MVVM, my mru list is data binding to the View model. Since I want to add a separator, and I don't want to insert a separator and an explicit input action into the list of items, I am currently using the itemcontrol container for my menu, but I have terrible filling problems. Do you have any solution that allows me to just add instances of MenuItem ?

Here's the XAML:

 <!-- MRU list --> <MenuItem Header="_Recent Files" > <ItemsControl ItemsSource="{Binding MostRecentlyUsed.Entries,Mode=OneWay}"> <ItemsControl.ItemTemplate> <DataTemplate> <MenuItem Header="{Binding ShortName}" ToolTip="{Binding FileName}" Command="{Binding OpenCommand}"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> <Separator /> <MenuItem Header="_Clean Entries" Command="{Binding MostRecentlyUsed.CleanCommand}" /> </MenuItem> <Separator /> 

Cheers, Florian

+6
data-binding wpf mvvm xaml mru
source share
1 answer

Replace the DataTemplate with ItemContainerStyle as follows:

 <MenuItem Header="_Recent Files" ItemsSource="{Binding Commands,Mode=OneWay}"> <MenuItem.ItemContainerStyle> <Style TargetType="{x:Type MenuItem}"> <Setter Property="Header" Value="{Binding Path=ShortName}" /> <Setter Property="ToolTip" Value="{Binding Path=FileName}" /> <Setter Property="Command" Value="{Binding Path=OpenCommand}" /> <Setter Property="CommandParameter" Value="{Binding Path=OpenParameter}" /> <Style.Triggers> <DataTrigger Binding="{Binding Path=IsSeparator}" Value="true"> <Setter Property="MenuItem.Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type MenuItem}"> <Separator Style="{DynamicResource {x:Static MenuItem.SeparatorStyleKey}}"/> </ControlTemplate> </Setter.Value> </Setter> </DataTrigger> </Style.Triggers> </Style> </MenuItem.ItemContainerStyle> </MenuItem> 

Here is the code that I associate with it, it looks like your code (but different):

 public class MainViewModel : ViewModelBase { public MainViewModel() { GoCommand = new DelegateCommand<object>(OnGoCommand, CanGoCommand); LoadCommands(); } private List<MyCommand> _commands = new List<MyCommand>(); public List<MyCommand> Commands { get { return _commands; } } private void LoadCommands() { MyCommand c1 = new MyCommand { OpenCommand = GoCommand, OpenParameter = "1", ShortName = "Doc1", FileName = "Doc1.txt", IsSeparator = false }; MyCommand c2 = new MyCommand { OpenCommand = GoCommand, OpenParameter = "2", ShortName = "Doc2", FileName = "Doc1.txt", IsSeparator = false }; MyCommand c3 = new MyCommand { OpenCommand = GoCommand, OpenParameter = "4", ShortName = "", FileName = "", IsSeparator = true }; MyCommand c4 = new MyCommand { OpenCommand = GoCommand, OpenParameter = "5", ShortName = "_Clean Entries", FileName = "Clean Entries", IsSeparator = false }; _commands.Add(c1); _commands.Add(c2); _commands.Add(c3); _commands.Add(c4); } public ICommand GoCommand { get; private set; } private void OnGoCommand(object obj) { } private bool CanGoCommand(object obj) { return true; } } public class MyCommand { public ICommand OpenCommand { get; set; } public string ShortName { get; set; } public string FileName { get; set; } public string OpenParameter { get; set; } public bool IsSeparator { get; set; } } 
+8
source share

All Articles