Пользовательская панель управления должна вызывать методы на моей виртуальной машине.Как это сделать? - PullRequest
0 голосов
/ 25 декабря 2011

Вот мой вопрос.У меня есть UserControl, который оборачивает группу кнопок, и это выглядит так: (я показываю 2 кнопки, чтобы проиллюстрировать, что это)пойти по соглашению и создать Cancel и Delete методы на моей виртуальной машине.Итак, XAML представления выглядит чисто.

Я хочу создать пользовательский элемент управления, который будет иметь ту же функциональность.Внутри управления мне придется обрабатывать события onClick для кнопок, и я хотел бы вызывать методы на ВМ так же, как это работает сейчас.Как будет выглядеть мой код?Думаю, мне нужно получить программный доступ к DataContext и как-то вызвать метод по имени.Я предполагаю использовать контроль следующим образом:

<myToolBar Mode="SaveExitDelete" />

Итак, это будет хорошо и коротко.Но myToolBar покажет 3 кнопки, и эти кнопки будут вызывать 3 метода (названных в соответствии с соглашением) в DataContext.

Любые указатели?

РЕДАКТИРОВАТЬ

Главный вопрос заключается в том, как программно связать команду или метод с кнопкой.Я понимаю, как работает команда, я использую PRISM, и у него есть встроенный DelegateCommand, который я могу использовать.Я не знаю, как создать связывание программно, когда я знаю имя метода или имя команды.

Вот как я вижу, как это работает:

var button = new DitatToolbarButton(); button.Caption = "Cancel &\nExit"; button.Icon = new BitmapImage(new Uri("img_btn_cancel.png", UriKind.Relative)); button.Command = Binding("CancelCommand");

Очевидно3-я строка неверна, но это то, что я хочу.Я хочу иметь возможность жестко закодировать строку, которая будет содержать имя команды, которую я буду ожидать от виртуальной машины.

1 Ответ

0 голосов
/ 26 декабря 2011

Обычно такого рода действия выполняются с помощью команд. В случае элемента управления Button, который уже имеет свойство «Command» DependencyProperty, это так просто:

<Button Command="{Binding DoItCommand}">Do it</Button>

и в вашем классе просмотра модели:

private ICommand DoItCommand
{
    get
    {
        return new DelegateCommand(param => DoIt(param), param => CanDoIt(param));
    }
}

где DoIt () и CanDoIt () являются методами в вашей модели представления, а DelegateCommand определен примерно так:

public class DelegateCommand : ICommand
{
    public DelegateCommand(Action<object> execute, Predicate<object> canExecute)
    {
        // ...

Вот хороший пример этого здесь . В пользовательском элементе управления вы можете объявить Command DependencyProperty самостоятельно. А в элементе управления каркасом, который не имеет Command DependencyProperty, вы можете использовать присоединенное свойство .

...