Как использовать одну и ту же RoutedCommand в разных элементах управления? - PullRequest
0 голосов
/ 10 июля 2009

У меня есть 2 различных элемента пользовательского интерфейса в разных файлах: menuItem (в window.xaml) и userControl (в foo.xaml).

Оба имеют абсолютно одинаковую логику: они включаются, только если выполняется условие, и вызывают один и тот же метод. Чтобы закодировать эту логику, я использую RoutedCommands .

Я мог бы использовать 2 разных RoutedCommands в каждом файле с одинаковыми условиями в CanExecute и Выполнено . Это работает.

Я бы хотел улучшить код, чтобы он соответствовал D.R.Y. править и экстернализировать routedCommand и присоединенные методы. Это связывание в обоих файлах:

<CommandBinding Command="{x:Static RoutedCommands:TestRoutedCommand.test}"
                    Executed="RoutedCommands:TestRoutedCommand.OnTest"
                    CanExecute="RoutedCommands:TestRoutedCommand.CanTest" />

это TestRoutedCmmand.cs:

public class TestRoutedCommand
{
    public static RoutedCommand test = new RoutedCommand();

    public static void OnTest(object sender, ExecutedRoutedEventArgs e)
    {
        System.Windows.MessageBox.Show("test -on");
    }

    public static void CanTest(object sender, CanExecuteRoutedEventArgs e)
    {
        System.Windows.MessageBox.Show("test -can");

        e.CanExecute = true;
    }
}

Когда я это делаю, компилятор сообщает об этой ошибке:

Error   1   unknown generation error, 'MC6005 :        
Executed="RoutedCommands:TestRoutedCommand.OnTest" is not valid.  
'RoutedCommands:TestRoutedCommand.OnTest' is not a valid name for an event handler method. 
Only instance methods of the generated class or code-behind are valid

(перевод может быть неточным, поскольку исходное сообщение не было на английском языке)

Кажется, что внешние методы не поддерживаются, но я был бы уверен, что что-то не пропустил. Интересно, это тот факт, что мои методы статичны?

Есть ли другой способ экстернализовать мои методы или мне нужно остаться с этими 4 методами, вызывая только 2 других?

Примечание: в моем проекте это более 30 дублированных методов routedCommand, вызывающих только 2 других ... вот почему меня это так беспокоит.

Спасибо.

Ответы [ 2 ]

1 голос
/ 10 июля 2009

Предположительно, ваш RoutedCommand является членом static в классе (например, Commands). Вам нужно передать этот static член в свойство Command:

<CommandBinding Command="{x:Static local:Commands.TestCommand}"
                    Executed="RoutedCommands.TestRoutedCommand.OnTest"
                    CanExecute="RoutedCommands.TestRoutedCommand.CanTest" />
0 голосов
/ 16 июля 2009

Я отвечаю себе:

Поскольку компилятор не принимает extern-делегаты с RoutedCommand, рекомендуется использовать пользовательскую реализацию ICommand, такую ​​как these . Больше не требуется CommandBinding, и проблема решена!

...