Как привязать команду из MainViewModel к шаблонному элементу Menu в Avalonia UI?
В настоящий момент мой код в axaml таков:
<Menu
Background="#1A1E27"
>
<MenuItem
Header="Открыть"
ItemsSource="{Binding Projects}"
>
<MenuItem.ItemTemplate>
<DataTemplate>
<MenuItem
Header="{Binding Path=Name}"
>
<MenuItem.Styles>
<Style
Selector="MenuItem MenuItem"
>
<Setter
Property="Command"
Value="{Binding OpenProjectCommand}"
/>
</Style>
</MenuItem.Styles>
</MenuItem>
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
</Menu>
Projects - объект типа ObservableCollection<Project>. Приведенный axaml влечет вызов метода OpenProjectCommand в классе Project. Подскажите, пожалуйста, как я могу изменить контекст, чтобы осуществлялся вызов метода OpenProjectCommand, реализованного в моей ViewModel?
Ответы (2 шт):
Нужно использовать атрибут Command.
Не все элементы поддерживают этот атрибут, может потребоваться, по-хорошему, написать свой View, который будет поддерживать Command, и, по-плохому, использовать атрибут OnClick (вызывает метод) на месте.
Есил бы ты привел код как у тебя реализована команда, было бы что посмотреть, потому-что у меня на menuitem без проблем накидывается command. Если прям никак, то попробуй сделать через event вызвав эту же команду через datacontext
var dc = DataContext as MainWindowViewModel;
dc.AddNewRow.Execute(tb.DataContext as MarkTable).Subscribe();
во второй строке я через метод вызываю свою команду, внутри Execute() записано обращение к тексблоку через мой класс MarkTable. Также можно не писать атрибуты для Execute, а просто оставить его пустым
var dc = DataContext as MainWindowViewModel;
dc.AddNewRow.Execute().Subscribe();
(Хотел написать коммент, но у меня репутации мало)