#wpf #expression-blend #eventtrigger #invoke-command
#wpf #выражение-blend #eventtrigger #вызвать команду
Вопрос:
это мой первый вопрос о переполнении стека, поэтому, пожалуйста, будьте аккуратны 🙂
В одном из моих окон WPF у меня есть listbox, элементы которого оформлены следующим шаблоном данных:
<ListBox.ItemTemplate>
<DataTemplate>
<Grid UseLayoutRounding="True" Width="80">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Border
Grid.Row="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
>
<Viewbox
Height="110"
Width="50"
HorizontalAlignment="Center"
VerticalAlignment="Center"
>
<Grid Background="#77ffffff" Margin="0">
<i:Interaction.Triggers>
<ei:KeyTrigger Key="Return">
<i:InvokeCommandAction
Command="{Binding SelectModelCommand}"
CommandParameter="{Binding}"
/>
</ei:KeyTrigger>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction
Command="{Binding SelectModelCommand}"
CommandParameter="{Binding}"
/>
</i:EventTrigger>
</i:Interaction.Triggers>
<Path Stroke="{DynamicResource FontBrush}"
StrokeThickness="100"
Data="{Binding DrawingPathString, FallbackValue={x:Static bll:Panel.NoDrawing}}"/>
</Grid>
</Viewbox>
</Border>
<TextBlock
Grid.Row="1"
FontSize="8"
TextWrapping="NoWrap"
HorizontalAlignment="Center"
Text="{Binding Path=BLLPanel.Model,FallbackValue=MODEL}"
/>
<TextBlock
Grid.Row="2"
FontSize="8"
TextWrapping="NoWrap"
HorizontalAlignment="Center"
Text="{Binding Path=BLLPanel.PanelFamily.Description,FallbackValue=FAMILY}"
/>
</Grid>
</DataTemplate>
Обратите внимание на два триггера в сетке:
-
KeyTrigger, который вызывает ICommand в моей модели представления
-
EventTrigger, который должен делать точно то же самое, но по какой-то неизвестной причине не делает
Кто-нибудь может объяснить мне, почему? Спасибо за ваше время и внимание
Sven
Комментарии:
1. Объект command, к которому вы привязываетесь (SelectModelCommand), возвращает true для CanExecute?
2. Привет, спасибо за ответ. Отвечая на ваш вопрос: да, ICommand возвращает правильное значение. Об этом свидетельствует тот факт, что KeyTrigger работает должным образом.
Ответ №1:
Дело в том, что нет MouseDoubleClick
события…
Но я полагаю, что то, что вы пытаетесь сделать, может быть легко достигнуто с помощью ImputBindings
:
<Grid Background="#77ffffff" Margin="0">
<Grid.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding SelectModelCommand}"/>
</Grid.InputBindings>
...
</Grid>
Комментарии:
1. Спасибо за ваш ответ, Павел. Мне придется попробовать это, чтобы посмотреть, сработает ли это (в данный момент я занят другими делами).
2. Обновление: оказывается, предложение Павло тоже не сработало. Согласно этой теме на форумах msdn , это связано с ошибкой в WPF. 🙁 В итоге я последовал предложению Марко Чжоу об обработке предварительного просмотра MouseDoubleClick в коде за. Фу! Позор вам, Microsoft, за то, что вы до сих пор не исправили эту ошибку.