Caliburn.Micro Добавить Dynami c MenuItem - PullRequest
1 голос
/ 30 марта 2020

Я использую Caliburn.Micro. Я пытаюсь создать динамическое c ItemMenu в существующем меню. Во View "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);
    }

И когда я выполняю, у меня есть это сообщение:

enter image description here

Как я могу создать Dynami c MenuItemg, не выполняя дополнительный вид и вспомогательный вопрос, как вызвать команду с параметром, который содержит текст menuitem (я пытаюсь сделать самый последний файл)

1 Ответ

1 голос
/ 27 апреля 2020

Для динамического 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
...