Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ListView项目单击事件MVVM_C#_Wpf_Listview_Eventtrigger - Fatal编程技术网

C# ListView项目单击事件MVVM

C# ListView项目单击事件MVVM,c#,wpf,listview,eventtrigger,C#,Wpf,Listview,Eventtrigger,我有一个菜单项,里面有ListView。我想要的是,当我单击ListView项时,会触发一些命令。这是我的密码: <MenuItem Header="?"> <ListView ItemsSource="{Binding CommentTemplateList}" BorderThickness="0" SelectedItem="{Binding SelectedCommentTemplate, UpdateSourceTrigger=PropertyChanged}

我有一个菜单项,里面有ListView。我想要的是,当我单击ListView项时,会触发一些命令。这是我的密码:

<MenuItem Header="?">
    <ListView ItemsSource="{Binding CommentTemplateList}" BorderThickness="0" SelectedItem="{Binding SelectedCommentTemplate, UpdateSourceTrigger=PropertyChanged}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <i:InvokeCommandAction Command="{Binding PasteTemplate}"
CommandParameter="{Binding SelectedCommentTemplate}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <ListView.View>
            <GridView>
                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Caption}" ToolTip="{Binding Description}" HorizontalAlignment="Center"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
   </ListView>
</MenuItem>


一切正常,但命令粘贴模板仅在选择更改时触发,我需要在每次单击该项时触发它。如果我从列表()中将EventName更改为一,例如MouseDown,则该命令根本不会启动。

如果要使用“SelectionChanged”,可以在代码后重置选择。只需将其添加到粘贴模板上即可

if(((ListView)sender).SelectedIndex == -1)return;
//your code
((ListView)sender).SelectedIndex = -1;
因此,在代码之后,ListView没有选择的元素。因此,如果再次单击,选择将再次更改,代码将再次激发


注意:您也可以使用MouseDown,但这有点棘手。例如,如果用户没有单击您的任何项目,而是单击了ListView中的其他位置,则它会使用您当前的选择再次触发。

您可以按照此处的建议处理
ListViewItem
预览鼠标向下事件:


..
如果不想从代码隐藏中调用视图模型的命令,可以将相同的功能包装到附加的行为中:


在上面的链接中有一个示例提供了更多信息。

要做到这一点,在尊重MVVM体系结构的同时,最好的方法是将特定行为添加到xaml代码中,如下所示:

 <ListView x:Name="ListView"
           ItemsSource="{x:Bind ViewModel.SampleItems, Mode=OneWay}"
           SelectedItem="{x:Bind ViewModel.SelectedItem, Mode=OneWay}"
           IsItemClickEnabled="True">
     <i:Interaction.Behaviors>
         <ic:EventTriggerBehavior EventName="ItemClick">
             <ic:InvokeCommandAction Command="{x:Bind ViewModel.ItemClickCommand}" />
         </ic:EventTriggerBehavior>
     </i:Interaction.Behaviors>
 </ListView>
private void OnItemClick(ItemClickEventArgs args)
{
    ListDataItem item = args?.ClickedItem as ListDataItem; 
    //DO what ever you want with the Item you selected in the click
}

注意:RelayCommand用于使用MVVMLight框架处理命令。

我使用的是MVVM,因此我已将Listview SelectedIndex属性绑定到SelectedTemplateIndex变量。我的代码:XAML:
SelectedIndex=“{Binding SelectedTemplateIndex}”
ViewModel:
private void OnPasteTemplateExecute(){if(SelectedTemplateIndex==
-1)返回;LeaveCommentBox=SelectedCommentTemplate.Description;
SelectedTemplateIndex=-1;}
我看到了相同的行为-只有当选择实际发生变化时,命令才会触发。
SelectedTemplateIndex=-1
应该重置您的选择。它选择-1st元素(在listview中,这意味着不选择任何内容),并允许您再次选择。如果仍然无法重置,您可以尝试重置您的SelectedItem或100%为我检查此功能,我希望这会有所帮助
public ICommand ItemClickCommand
{
    get
    {
        if (_itemClickCommand == null)
        {
            _itemClickCommand = new RelayCommand<ItemClickEventArgs>(OnItemClick);
        }

        return _itemClickCommand;
    }
}
private void OnItemClick(ItemClickEventArgs args)
{
    ListDataItem item = args?.ClickedItem as ListDataItem; 
    //DO what ever you want with the Item you selected in the click
}