从ItemsControl(WPF MVVM)触发事件

时间:2018-03-15 18:54:42

标签: c# wpf mvvm itemscontrol eventtrigger

我正在使用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>

2 个答案:

答案 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而不是主视图模型。