Caliburn.Micro 添加动态菜单项
Caliburn.Micro Add Dynamic MenuItem
我正在使用 Caliburn.Micro
我尝试在现有菜单中创建动态 ItemMenu。
在视图 "MainView.xaml" 中,我输入了
<Menu Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="4" Margin="0">
<MenuItem Header="_File">
<MenuItem Header="_Open" Name="FileOpen"/>
<ContentControl x:Name="MenuItems" />
<Separator/>
<ItemsControl ItemsSource="{Binding RFL}"/>
<!--<common:RecentFileList x:Name="RecentFileList">
</common:RecentFileList>-->
</MenuItem>
在 ViewModel 中 "MainViewModel" 我有这个
public BindableCollection<MenuItem> MenuItems
{
get { return menuItems; }
set { menuItems = value; }
}
public void MenuItem_New()
{
}
public MainViewModel()
{
recentFileList.MenuClick += (s, e) => SendPathToUserControls(e.Filepath);
MenuItems = new BindableCollection<MenuItem>();
this._menu = new MenuViewModel();
MenuItem menuItem = new MenuItem( );
menuItem.Header = "Sous Menu 1";
menuItem.Name = "SousMenu1";
MenuItems.Add(menuItem);
}
当我执行时,我收到这条消息:
如何在不创建视图的情况下创建动态 MenuItemg
还有一个附属问题,如何使用包含菜单项文本的参数引发命令(我正在尝试做一个最新文件)
对于动态菜单你可以使用CompositeCollection
对于最近的文件列表,我有一个示例
<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>
您通过从引导程序调用此方法来创建自定义绑定 See that
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;
});
}
你创建一个新的class例如
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; }
}
在您的 mainMenuviewmodel(例如)中,您有:(名称约定 xith Caliburn)
RecentFiles = new BindableCollection<RecentFileViewModel>(ListRecentFiles());
//you manage your ListRecentFiles
public bool CanOpenRecentFile
{
get { return Recentfiles.Any(); }
}
public void OpenRecentfile(RecentFileViewModel recentfile)
{
//todo
我正在使用 Caliburn.Micro 我尝试在现有菜单中创建动态 ItemMenu。 在视图 "MainView.xaml" 中,我输入了
<Menu Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="4" Margin="0">
<MenuItem Header="_File">
<MenuItem Header="_Open" Name="FileOpen"/>
<ContentControl x:Name="MenuItems" />
<Separator/>
<ItemsControl ItemsSource="{Binding RFL}"/>
<!--<common:RecentFileList x:Name="RecentFileList">
</common:RecentFileList>-->
</MenuItem>
在 ViewModel 中 "MainViewModel" 我有这个
public BindableCollection<MenuItem> MenuItems
{
get { return menuItems; }
set { menuItems = value; }
}
public void MenuItem_New()
{
}
public MainViewModel()
{
recentFileList.MenuClick += (s, e) => SendPathToUserControls(e.Filepath);
MenuItems = new BindableCollection<MenuItem>();
this._menu = new MenuViewModel();
MenuItem menuItem = new MenuItem( );
menuItem.Header = "Sous Menu 1";
menuItem.Name = "SousMenu1";
MenuItems.Add(menuItem);
}
当我执行时,我收到这条消息:
如何在不创建视图的情况下创建动态 MenuItemg 还有一个附属问题,如何使用包含菜单项文本的参数引发命令(我正在尝试做一个最新文件)
对于动态菜单你可以使用CompositeCollection
对于最近的文件列表,我有一个示例
<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>
您通过从引导程序调用此方法来创建自定义绑定 See that
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;
});
}
你创建一个新的class例如
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; }
}
在您的 mainMenuviewmodel(例如)中,您有:(名称约定 xith Caliburn)
RecentFiles = new BindableCollection<RecentFileViewModel>(ListRecentFiles());
//you manage your ListRecentFiles
public bool CanOpenRecentFile
{
get { return Recentfiles.Any(); }
}
public void OpenRecentfile(RecentFileViewModel recentfile)
{
//todo