从MVVM中的ListView调用命令

时间:2014-10-08 22:19:59

标签: c# mvvm custom-controls winrt-xaml prism

我使用Prism for Windows Runtime在我的ViewModel中使用DelegateCommands连接我的视图中的事件。我想知道从包含Buttons的ListView(或者派生自定义Button类的自定义控件)调用命令(例如选择项)的最佳方法是什么。我想保持Button控件提供的效果(例如背景变化,倾斜效果)。但不幸的是,按钮会吸收点击事件,因此,我无法在ListView中使用以连接我的命令,例如使用以下XAML(和行为SDK):

<ListView ItemsSource="{Binding AvailableItemsList}" SelectionMode="Single">
    <ListView.ItemTemplate>
        <DataTemplate>
            <customControls:NavMenuButton Style="{StaticResource SelectionListMenuButton}" Content="{Binding Nickname}" DescriptionText="{Binding Name}" />
        </DataTemplate>
    </ListView.ItemTemplate>
    <i:Interaction.Behaviors>
        <core:EventTriggerBehavior EventName="SelectionChanged">
            <core:InvokeCommandAction Command="{Binding ItemSelectedCommand}" />
        </core:EventTriggerBehavior>
    </i:Interaction.Behaviors>
</ListView>

实现这一目标的最佳方法是什么?我发现了类似的问题,但这里的不同之处在于列表项中的控件显然是&#34;窃取&#34; click事件(虽然它可以正常使用,例如一个简单的TextBlock)。

2 个答案:

答案 0 :(得分:1)

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

<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>

答案 1 :(得分:0)

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

现在,对于点击相关问题,您可以修改按钮的Controltemplate,使其看起来像一个简单的文本块。这样你的点击也可以在列表视图上运行,它不会显示为按钮。

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

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