ListView item click event MVVM 点击ListView项的事件 MVVM

20 浏览
0 Comments

ListView item click event MVVM 点击ListView项的事件 MVVM

我有一个包含ListView的MenuItem。我想要的是当我点击ListView项目时,触发一些命令。这是我的代码:


    
        
            
                
            
        
        
            
                
                    
                        
                            
                        
                    
                
            
        
   

一切都好,但是只有在选择改变时才会触发PasteTemplate命令,而我需要每次点击项目时都触发它。如果我将EventName更改为列表中的一个(https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.aspx),例如MouseDown,命令根本不会触发。

0
0 Comments

在使用MVVM模式下,当点击ListView的项时,无法触发事件的原因是因为每次点击后,选中的项会再次被改变,导致代码再次触发。解决方法是在代码执行后重置ListView的选中项。

具体的解决方法如下:

if(((ListView)sender).SelectedIndex == -1) return;
// 执行你的代码
((ListView)sender).SelectedIndex = -1;

解释一下,当ListView的选中项索引为-1时,表示没有选中任何项,此时直接返回,不执行代码。当执行完代码后,将ListView的选中项索引重新设置为-1,以清除选中状态。这样,再次点击ListView时,选中状态会再次改变,代码也会再次触发。

另外,也可以尝试使用MouseDown事件来解决这个问题,但这种方法稍微有点棘手。例如,如果用户在ListView内的其他地方(如上述链接中所示的位置)点击而不是点击任何项,代码仍然会执行。

对于使用MVVM的情况,可以将ListView的SelectedIndex属性绑定到SelectedTemplateIndex变量。具体的代码如下:

XAML:

SelectedIndex="{Binding SelectedTemplateIndex}"

ViewModel:

private void OnPasteTemplateExecute()
{
    if (SelectedTemplateIndex == -1) return;
    LeaveCommentBox = SelectedCommentTemplate.Description;
    SelectedTemplateIndex = -1;
}

在ViewModel中,当执行PasteTemplate命令时,首先判断SelectedTemplateIndex是否为-1,如果是则直接返回,不执行代码。如果不是-1,则执行相应的代码,并将SelectedTemplateIndex重置为-1,以清除选中状态。

总结起来,将SelectedTemplateIndex设置为-1可以重置选中状态,这样可以再次进行选择。如果仍然无法重置,可以尝试重置SelectedItem或参考上述链接中的解决方法。

0
0 Comments

问题的原因:在MVVM模式中,当点击ListView的项时,希望能够触发ViewModel中的命令。然而,在ListView中默认情况下,点击项不会触发任何事件或命令。

解决方法:在ListView的ItemContainerStyle中添加一个事件处理程序,来处理项的点击事件。通过添加以下代码到ListView的XAML中,可以实现这一点:


    
        
    
    ..

这段代码为ListView的每个项添加了一个PreviewMouseLeftButtonDown事件处理程序,该处理程序在点击项时将会被调用。

另外,如果不想在代码后端中调用ViewModel的命令,可以将相同的功能封装在一个附加行为中。可以通过阅读上面给出的链接,了解如何使用附加行为来实现这一点。

0
0 Comments

ListView item click event MVVM这个问题的出现是因为需要在MVVM架构中实现ListView项的点击事件处理。解决方法是在XAML代码中添加特定的行为,并在ViewModel中声明一个ICommand属性来处理点击事件。

具体解决方法如下:

首先,在XAML代码中添加以下行为来处理ListView项的点击事件:


     
         
             
         
     
 

然后,在ViewModel中声明一个ICommand属性来处理点击事件:

public ICommand ItemClickCommand
{
    get
    {
        if (_itemClickCommand == null)
        {
            _itemClickCommand = new RelayCommand(OnItemClick);
        }
        return _itemClickCommand;
    }
}

最后,像在代码后台处理事件一样定义命令:

private void OnItemClick(ItemClickEventArgs args)
{
    ListDataItem item = args?.ClickedItem as ListDataItem; 
    // 在点击事件中处理选中的项
}

注意:RelayCommand是使用MVVMLight框架来处理命令的。

这个方法对我来说完全有效,希望对你也有帮助。

0