WPF ICommand по сравнению с RoutedCommand

Ну, технически любой такой объект завершит то, чтобы быть созданным по библиотеке потока C-стиля, потому что C++ только что определил запас std::thread модель в C++ 0x, который был просто закреплен и еще не был реализован. Проблема является несколько системной, технически существующая модель памяти C++ не достаточно строга для обеспечения четко определенной семантики для всего из, 'происходит перед' случаи. Hans Boehm написал работу по теме некоторое время назад и способствовал выработке C++ 0x стандарт по теме.

http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html

, Который сказал, существует несколько межплатформенных библиотек C++ потока, которые работают просто великолепно на практике. Стандартные блоки потока Intel содержат tbb:: распараллельте возражают, что тесно приближает C++ 0x стандарт, и Повышение имеет повышение:: библиотека потока, которая делает то же.

http://www.threadingbuildingblocks.org/

http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html

Используя повышение:: поток Вы получили бы что-то как:

#include 

void task1() { 
    // do stuff
}

void task2() { 
    // do stuff
}

int main (int argc, char ** argv) {
    using namespace boost; 
    thread thread_1 = thread(task1);
    thread thread_2 = thread(task2);

    // do other stuff
    thread_2.join();
    thread_1.join();
    return 0;
}

48
задан PaN1C_Showt1Me 16 July 2009 в 07:37
поделиться

2 ответа

Как вы заметили, класс RoutedCommand является реализацией интерфейса ICommand , его основное отличие, если это его функция, аналогична функции RoutedEvent :

Методы Execute и CanExecute в RoutedCommand не содержат логики приложения для команды, как в случае с типичной ICommand, а скорее, эти методы вызывают события, которые проходят по дереву элементов в поисках объекта с CommandBinding. Обработчики событий, прикрепленные к CommandBinding, содержат логику команды.

Метод Execute вызывает события PreviewExecuted и Executed. Метод CanExecute вызывает события PreviewCanExecute и CanExecute.

В случае, когда вы не хотите, чтобы поведение RoutedCommand вы ' Я рассмотрю вашу собственную реализацию ICommand . Что касается паттерна MVVM, я не могу сказать одно решение, похоже, что у каждого своя методология. Однако вот несколько подходов к этой проблеме, с которыми я столкнулся:

66
ответ дан 26 November 2019 в 18:47
поделиться

Как насчет чего-то вроде этого:

Большинство реализаций MVVM, с которыми я сталкивался, пытаются использовать привязку к ViewModel, и, таким образом, ViewModel (а не View) владеет логикой CanExecute / Execute.

В отличие от этого, обработчики событий переносят это бремя на View. Затем обработка может быть распространена на ViewModel, но это означает немного более высокую степень связи между ViewModel и View (приведение + вызов метода и т. Д.).

Большинство реализаций MVVM, с которыми я сталкивался, пытаются использовать привязку к ViewModel, и, таким образом, ViewModel (а не View) владеет логикой CanExecute / Execute.

В отличие от этого, обработчики событий переносят это бремя на View. Затем обработка может быть распространена на ViewModel, но это означает немного более высокую степень связи между ViewModel и View (приведение + вызов метода и т. Д.).

25
ответ дан 26 November 2019 в 18:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: