我正在使用WPF MVVM设计模式。我需要从使用ItemsControl创建的文本框中引发PreviewKeyDown事件。我可以将项添加到集合SourceCollection,但无法使用交互触发器触发PreviewKeyDown事件。关于我在xaml中可能缺少什么的任何想法都表示赞赏:)这是我的代码:
MainWindow.xaml
cat records_to_delete.txt | psql $server -c "COPY tmp_widgets FROM STDIN;"
MainWindowViewModel.cs
<Grid>
<ItemsControl ItemsSource="{Binding SourceCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding CollectionText}" Foreground="{Binding Path=ForegroundColor}"
FontSize="16" FontWeight="ExtraBold" FontFamily="Courier New">
<i:Interaction.Triggers>
<i:EventTrigger EventName="PreviewKeyDown">
<i:InvokeCommandAction Command="{Binding KeyDownAction}"></i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
答案 0 :(得分:1)
“InvokeCommandAction”中命令的“绑定”不正确。它不在单个集合项上,而是在ViewModel级别。将其更改为:
<i:InvokeCommandAction
Command="{Binding RelativeSource={RelativeSource AncestorType=Window},
Path=DataContext.KeyDownAction}">
</i:InvokeCommandAction>
这样您就可以指向ViewModel中定义的命令。
答案 1 :(得分:0)
您应该在WindowModel中使用以下ICommand定义,而不是MainWindowViewModel。
public RelayCommand<KeyEventArgs> KeyDownAction
{
get { return new RelayCommand<KeyEventArgs>(KeyDownMethod); }
}
private void KeyDownMethod(KeyEventArgs e)
{
//some code here
}
因为itemcontrol的item模板的datacontext是item而不是主视图模型。