Заставить элемент управления TreeViewItem выполнять команду при двойном щелчке

Я ищу способ в WPF привязать команды к TreeViewItem, поэтому, когда я дважды щелкаю TreeViewItem, ICommand выполняется в моей ViewModel (шаблон MVVM). Очень похоже на обозреватель решений Visual Studio.

Я надеялся, что смогу использовать что-то вроде AttachedCommandBehaviour. но это не работает. Я предполагаю, что это потому, что сам TreeViewItem не поддерживает команды.

Вот моя тестовая реализация, которая не работает:

<TreeViewItem Header="Opret produktions ordre">
    <acb:CommandBehaviorCollection.Behaviors>
        <acb:BehaviorBinding Event="MouseLeftButtonDown" Command="{Binding TestCommand}"/>
    </acb:CommandBehaviorCollection.Behaviors>
</TreeViewItem>

У кого-нибудь есть предложение о том, как заставить это работать? Или, может быть, вы знаете элемент управления, который дает мне эту функциональность? Я, конечно, надеюсь на решение, дружественное к MVVM. Желательно все в XAML.


person Vern    schedule 24.03.2011    source источник


Ответы (1)


Пробовали ли вы InvokeDataCommand триггер из библиотеки примеров CodePlex Expression Blend?

<i:EventTrigger EventName="Click">
      <si:InvokeDataCommand Command="{Binding ShoppingCart.CheckOutCommand}"/>
</i:EventTrigger>

Вам понадобится исправленная версия, однако, если вы используете WPF4, прочитайте об этой проблеме здесь: http://blog.thekieners.com/2010/11/09/expression-blend-samples-not-working.-with-silverlight-4-and-wpf-4/

Загрузите пример решения отсюда (это обновленная версия): http://expressionblend.codeplex.com/workitem/8148

person dain    schedule 24.03.2011
comment
Их документация довольно бедна. У вас есть пример? - person Vern; 24.03.2011
comment
Обязательно загрузите образец решения, добавив правильную ссылку. Я нашел пример в библиотеке образцов довольно понятным, а также добавил к моему ответу отправную точку, но дайте мне знать, если / где вам нужна дополнительная информация! - person dain; 24.03.2011
comment
У меня проблема с компиляцией, с которой вы могли бы мне помочь. Expression.Samples.Interactivity зависит от System.Windows v2.0.50727. Когда я ссылаюсь на сборку Expression.Samples.Interactivity в своем проекте и использую InvokeDataCommand, я получаю сообщение об ошибке компиляции, говорящее о том, что он не может разрешить зависимость от сборки System.Windows. Есть идеи? Похоже на то, что осталось от WPF2. - person Vern; 24.03.2011
comment
Вы установили Expression Blend 4? Если нет, возможно, вам придется скачать Expression SDK. В остальном не уверен :) - person dain; 25.03.2011
comment
Я не уверен, что хочу, чтобы мое решение зависело от этого :) И я не хочу включать двоичные файлы WPF2. Должно быть другое решение. - person Vern; 25.03.2011
comment
Что плохого в установке SDK, если вам не нужен сам Blend (хотя это действительно здорово)? Иначе вы не сможете использовать поведения и триггеры! Его размер составляет 4,2 МБ: microsoft.com/downloads/ru/ - person dain; 25.03.2011
comment
Это действительно странно, не знаю, почему/если у вас должны быть библиотеки v2. Вы загрузили последнюю версию Expression SDK? Также вы загрузили обновленные примеры Blend, на которые я ссылался? Я думаю, что оригинальные были действительно сделаны для v2 Silverlight/WPF, но последние из последней ссылки отлично работали для меня с Silverlight 4. Или, может быть, у вас по какой-то причине установлен более старый Expression SDK в комплекте с чем-то, что вам нужно удалить или убедиться, что вы явно включаете библиотеки v4? - person dain; 26.03.2011
comment
У меня установлена ​​последняя версия Expression SDK. Я только что дважды проверил. Я использую библиотеку, на которую вы ссылаетесь здесь (вложение файла): expressionblend.codeplex.com/workitem /8148 - person Vern; 28.03.2011
comment
У меня заканчиваются идеи, в чем может быть проблема. Будет ли этот пример решения работать, если вы попытаетесь запустить его? - person dain; 30.03.2011
comment
Является ли это примером решения, о котором вы говорите? Если это так, это не работающее приложение с графическим интерфейсом, которое я могу протестировать. Хотя я могу его скомпилировать. - person Vern; 01.04.2011
comment
Да, тот. Если это скомпилируется, проблема может быть в том, как вы пытаетесь импортировать его в свой проект? В моем случае я просто взял исходный код для классов, которые мне действительно нужны (и зависимости), обновил пути пакетов классов и использовал его таким образом из своего проекта внутри. Вы пытаетесь импортировать сборку? - person dain; 01.04.2011