C# 在MVVM中从ListView调用命令

C# 在MVVM中从ListView调用命令,c#,mvvm,custom-controls,winrt-xaml,prism,C#,Mvvm,Custom Controls,Winrt Xaml,Prism,我正在使用Prism for Windows Runtime将视图中的事件与ViewModels中的DelegateCommand连接起来。我想知道从包含按钮(或从Button类派生的自定义控件)的ListView调用命令(例如选择项)的最佳方式是什么。我想保留按钮控件提供的效果(例如背景变化、倾斜效果)。但不幸的是,该按钮吸收了单击事件,因此,我无法在ListView中使用这些事件来连接我的命令,例如使用以下XAML(和行为SDK): 实现这一目标的最佳方式是什么?我发现了类似的问题,但这

我正在使用Prism for Windows Runtime将视图中的事件与ViewModels中的DelegateCommand连接起来。我想知道从包含按钮(或从Button类派生的自定义控件)的ListView调用命令(例如选择项)的最佳方式是什么。我想保留按钮控件提供的效果(例如背景变化、倾斜效果)。但不幸的是,该按钮吸收了单击事件,因此,我无法在ListView中使用这些事件来连接我的命令,例如使用以下XAML(和行为SDK):



实现这一目标的最佳方式是什么?我发现了类似的问题,但这里的区别在于列表项中的控件显然“窃取”了单击事件(而它只适用于简单的文本块)。

要在ListView中绑定命令,可以使用ListView中的按钮

现在,对于与单击相关的问题,您可以修改按钮的Controltemplate,使其看起来像一个简单的文本块。这样,您的单击也将在listview上起作用,并且它不会显示为按钮

<ControlTemplate TargetType="Button">
        <TextBlock Text="{TemplateBinding Content}" />
    </ControlTemplate>


您还可以通过其他方式自定义单击事件,例如将焦点移动到按钮也会引发单击事件(间接触发命令)。这将有助于Listview,在Listview中,仅移动到下一项也应触发命令。

要结束此问题,以下是基于MatDev8上述评论的解决方案(谢谢!):



为什么不绑定到SelectedItem而不是使用eventrtrigger之类的东西呢?你想从listview中的按钮调用viewmodel中的methode吗?如果是,您只需要使用listviewdatacontext并像这样调用您的命令。Command=“{Binding DataContext.YourCommand,elementName=yourListView}@blindmeis:你是说SelectionChanged?我的理解是它没有实现ICommand,所以我需要在视图后面的代码中添加一些逻辑。这不是一个真正的问题,但在某种程度上打破了模式。我误解了吗?@MatDev8:嘿,这很有效-太好了!你能把它作为一个答案发布,这样我就可以点击复选标记吗?对于completeness可能添加CommandParameter=“{Binding Name}”“将所选项目作为参数传递给命令。非常感谢。非常感谢。我想我需要问清楚。我的控件模板看起来有点像你建议的-有点复杂。它添加了第二行,其中包含VisualStateManager。简化它会移除效果,但按钮仍会从ListView中抓取单击事件。我可以通过将按钮的IsEnabled属性设置为False来防止这种情况,在这种情况下,我也会失去效果,但它会起作用。在回答的第二部分中,您的意思是在代码隐藏中调用命令?我考虑过这一点,但希望找到一种直接在XAML中绑定命令的方法。
<ControlTemplate TargetType="Button">
        <TextBlock Text="{TemplateBinding Content}" />
    </ControlTemplate>
<ListView x:Name="myListView" ItemsSource="{Binding AvailableItemsList}" SelectionMode="Single">
    <ListView.ItemTemplate>
        <DataTemplate>
            <customControls:CustomTextButton Style="{StaticResource SelectionListMenuButton}" 
                                             Content="{Binding Nickname}" 
                                             DescriptionText="{Binding Name}"
                                             Command="{Binding DataContext.ItemSelectedCommand, ElementName=myListView}"
                                             CommandParameter="{Binding Name}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>