【问题标题】:Caliburn.Micro Add Dynamic MenuItemCaliburn.Micro 添加动态菜单项
【发布时间】:2020-03-30 16:11:12
【问题描述】:

我正在使用 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 而无需执行视图 和附属问题,如何使用包含菜单项文本的参数引发命令(我正在尝试做一个最新文件)

【问题讨论】:

    标签: wpf dynamic menuitem caliburn.micro


    【解决方案1】:

    对于动态菜单你可以使用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;
            });            
        }
    

    例如,您创建一个新类

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2015-05-26
      相关资源
      最近更新 更多