WPF как правильно создавать MenuItem?

207
16 мая 2019, 17:00

Я пытаюсь худо-бедно реализоввывать паттерн MVVM. При создании MenuItem возникли впросы по поводу привязки данных. Сейчас у меня в Model такая картина:

var menuCopyCutPasteDelete = new MenuItem[]
{
    new MenuItem(){Header = "Копировать"},
    new MenuItem(){Header = "Вырезать"},
    new MenuItem(){Header = "Вставить"},
    new MenuItem(){Header = "Удалить"},
};
var commands = new Model.Command[]
{
    new Model.Command(Model.FileBrowserManagers.Copy),
    new Model.Command(Model.FileBrowserManagers.Transfer),
    new Model.Command(Model.FileBrowserManagers.PasteAsync),
    new Model.Command(Model.FileBrowserManagers.Delete),
};
for (int i = 0; i < menuCopyCutPasteDelete.Length; i++)
{
    int a = i;
    menuCopyCutPasteDelete[a].Click += (sender,e) => commands[a].Execute(sender);
}

Выглядит очень ужасно. Возможно я должен создавать MenuItem элементы в xaml и биндить к ним ивенты? Или есть другой вариант? Подскажите пожалуйста.

Answer 1

Описываете в xaml меню:

<Menu>
    <MenuItem Header="Файл">
        <MenuItem Header="Копировать" Command="{Binding CopyCommand}"/>
        <MenuItem Header="Вырезать"   Command="{Binding CutCommand}"/>
        <MenuItem Header="Вставить"   Command="{Binding PasteCommand}"/>
        <MenuItem Header="Удалить"    Command="{Binding DeleteCommand}"/>
    </MenuItem>
</Menu>

В VM создаете команды(реализации ICommand есть такие как DelegateCommand, RelayCommand, можно найти в интернете):

public class MainVM : BaseVM
{
    public ICommand CopyCommand   { get; }
    public ICommand CutCommand    { get; }
    public ICommand PasteCommand  { get; }
    public ICommand DeleteCommand { get; }
}
Answer 2

в WPF есть стандартные уже реализованные команды попробуй их:

<MenuItem Header="Edit">
    <MenuItem Command ="ApplicationCommands.Copy"/>
    <MenuItem Command ="ApplicationCommands.Cut"/> 
    <MenuItem Command ="ApplicationCommands.Paste"/>
    <MenuItem Command ="ApplicationCommands.Delete"/> 
</MenuItem>

Эти команды даже сами назначят горячее клавиши и Header для MenuItem

READ ALSO
Показать координаты точки графика при наведении

Показать координаты точки графика при наведении

есть график функции типа chartНеобходимо написать код, что бы по наведению мышки на точку графика, показывались координаты точки

161
C# SendMessage отправку двух языков

C# SendMessage отправку двух языков

Нужно чтобы программа брала из textbox текст и отправляла, по нажатию кнопки, в то место, где грубо говоря ее вставят, будь то строчка в браузере...

196
Вращение PolygonCollider2D

Вращение PolygonCollider2D

Столкнулся с проблемойСуть: создаю двумя кликами объект из префаба

149