WPF: проблема с извлечением обработчиков команд из кода - PullRequest
2 голосов
/ 03 декабря 2010

В моем XAML определена некоторая привязка команд:

<UserControl.CommandBindings>
    <CommandBinding 
        Command="commands:Commands.GrantAccessCommand"
        Executed="HelpExecuted" />
</UserControl.CommandBindings>

Так что GrantAccessCommand находится в отдельном классе с именем Commands, а HelpExecuted находится в моем коде позади.Работает нормально.Теперь, когда я помещаю HelpExecuted в другой класс, я получаю сообщение об ошибке «... HelpExecuted» не является допустимым именем метода обработчика событий. Допустимы только методы экземпляра в сгенерированном классе или классе с выделенным кодом. »Код:

Executed="commands:Commands.HelpExecuted"
//I also tryed: Executed="x:Static commands:Commands.HelpExecuted"

Я знаю, что могу сделать это в коде с помощью CommandBindings.Add (new CommandBinding (GrantAccessCommand, HelpExecuted));Но я хочу сделать это, используя XAML

Есть ли способ?

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

Я предполагаю, что .Net 3.5. С http://www.codeproject.com/KB/WPF/CentralizingWPFCommands.aspx: XAML текущей версии WPF не позволяет нам таким образом связывать обработчики событий. Обработчики событий должны быть определены в файле code-behind внутри класса MainWindow. Я не знаю, является ли это ошибкой, случайно пропущенной функцией, или мы даже не должны использовать эту функцию, но это мешает нам определить централизованное расположение для обработки всех команд «Выполнено» и «События CanExecute. *

Обходной путь - определить привязки в коде:

window.CommandBindings.Add (новый CommandBinding (Справка, HelpExecuted, HelpCanExecute));

0 голосов
/ 06 декабря 2010

Понял с этим:

Определите вашу команду:

public class GrantAccessCommand : ICommand
{
    public event EventHandler CanExecuteChanged;
    InstalViewModel _viewModel;

    public GrantAccessCommand(InstalViewModel instalViewModel)
    {
        _viewModel = instalViewModel;
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        _viewModel.OnGrantAccessExecute();
    }
}

Создать команду в конструкторе модели представления

    public ViewModel()
    {
        _grantAccessCommand = new GrantAccessCommand(this);
    }

Команда Expose в вашей модели представления:

    public ICommand GrantAccessCommand
    {
        get { return _grantAccessCommand; }
    }

Привязать к нему в XAMl

<MenuItem x:Name="menuItemGrantAccess" Header="Grant Access"  
    Command="{Binding GrantAccessCommand}"
    IsEnabled=">
</MenuItem>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...