ListView上的按钮-使用MVVM

ListView上的按钮-使用MVVM,listview,mvvm,button,controls,Listview,Mvvm,Button,Controls,我在listview控件上有一个按钮。我已将此控件绑定到ViewModel类基类上的一个命令。如果我在listview之外放置一个按钮,那么使用相同的命令也可以正常工作。但是当我将命令放在listview上时,它不会被触发 你能想出一个理由吗 以下是片段: <ListView Grid.Row="2" AlternationCount="2" ItemsSource="{Binding Path=AObject}" Margin="20" MaxHeight="200">

我在listview控件上有一个按钮。我已将此控件绑定到ViewModel类基类上的一个命令。如果我在listview之外放置一个按钮,那么使用相同的命令也可以正常工作。但是当我将命令放在listview上时,它不会被触发

你能想出一个理由吗

以下是片段:

<ListView Grid.Row="2" AlternationCount="2" ItemsSource="{Binding Path=AObject}" Margin="20" MaxHeight="200">
            <ListView.DataContext>
                <local:MyViewModel/>
            </ListView.DataContext>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Run ID" DisplayMemberBinding="{Binding Path=RID}" />
                    <GridViewColumn Header="Job ID" DisplayMemberBinding="{Binding Path=JID}" />
                    <GridViewColumn Header="Run Description">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <ContentPresenter Content="{Binding Path=OpenScCommand}" HorizontalAlignment="Right"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Edit">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button  Command="{Binding ShowItemCommand}" CommandParameter="{Binding Path=RID}" Content="_Edit email run" IsDefault="False"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

当您将按钮放在listview中时,它将获得一个新的DataContext—它将获得列表中当前项的DataContext,因此它将丢失原始DataContext


最好的解决方案是使用

,这是因为按钮位于
列表视图项
中,因此它继承了包含它的项的数据上下文。以下是如何绑定到
列表视图本身的DataContext:

<Button  Command="{Binding ShowItemCommand}" DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}" ...

您也可以用更少的代码来实现这一点

<Button Command="{Binding ShowItemCommand}">
    <Button.DataContext>
        <local:MyViewModel/>
    </Button.DataContext>
 </Button>


在项目的视图模型上?!这些项表示数据,而不是逻辑。把命令放在那里是错误的,谢谢你们。我想是的。我本可以实现ViewModellocator方法,但这个方法的速度更快。