Для динамического c Меню Вы можете использовать CompositeCollection
Для RecentList файлов у меня есть пример
<MenuItem x:Name="RecentFiles" Header="Recent _Files" cal:Message.Attach="OpenRecentFile($srccontext)">
<MenuItem.Icon>
<Image Source="{StaticResource IconOpen}"/>
</MenuItem.Icon>
<MenuItem.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Caption}"/>
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
Вы создаете пользовательскую привязку, вызывая этот метод из начальной загрузки Обратите внимание, что
private void SetupCustomMessageBindings()
{
MessageBinder.SpecialValues.Add("$srccontext", context =>
{
var args = context.EventArgs as RoutedEventArgs;
if (args == null)
{
return null;
}
var fe = args.OriginalSource as FrameworkElement;
if (fe == null)
{
return null;
}
return fe.DataContext;
});
}
Вы создаете новый класс, например
public class RecentFileViewModel
{
private int index;
private const string shortcutKey = "_";
public RecentFileViewModel(string file, int index)
{
File = file;
this.index = index++;
Caption = string.Format("{0} {1}", GetShortcut(), file.Replace(shortcutKey, "__"));
}
private string GetShortcut()
{
var str = index.ToString();
if (str.Length == 1) return shortcutKey + str;
return str.Substring(0, str.Length - 1) + shortcutKey + str.Substring(str.Length - 1);
}
public string File { get; private set; }
public string Caption { get; private set; }
}
в своей модели mainMenuview (например), у вас есть: (имя конвенция с Калибурном)
RecentFiles = new BindableCollection<RecentFileViewModel>(ListRecentFiles());
//you manage your ListRecentFiles
public bool CanOpenRecentFile
{
get { return Recentfiles.Any(); }
}
public void OpenRecentfile(RecentFileViewModel recentfile)
{
//todo