2009-07-10 1 views
0

У меня есть два разных элемента интерфейса в отдельных файлах: menuItem (в window.xaml) и userControl (в foo.xaml).Как использовать тот же RoutedCommand в отдельных элементах управления?

Оба имеют точно такую ​​же логику: они включены только в том случае, если условие согласовано и вызывает тот же метод. Чтобы закодировать эту логику, я использую 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 дублированных маршрутизируемых методов вызова методов только 2 человека ... вот почему меня это так беспокоит.

Спасибо.

ответ

0

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

Поскольку компилятор не принимает Экстерн делегатов с RoutedCommand, лучшей практикой является использование пользовательской реализации ICommand как these. Больше не требуется CommandBinding, и проблема решена!

+1

К сожалению, ссылка больше не действительна. Я был бы очень заинтересован в предлагаемом решении, вы можете это объяснить? – Wilbert

1

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

<CommandBinding Command="{x:Static local:Commands.TestCommand}" 
        Executed="RoutedCommands.TestRoutedCommand.OnTest" 
        CanExecute="RoutedCommands.TestRoutedCommand.CanTest" /> 
+0

Действительно, я забыл x: Static ... Спасибо, но это не решает мою проблему. Я отредактировал свой вопрос, чтобы исправить это, а точнее. – rockeye

Смежные вопросы