Wpf ICommand覆盖SelectedItem

Wpf ICommand覆盖SelectedItem,wpf,listview,selecteditem,icommand,Wpf,Listview,Selecteditem,Icommand,我是WPF的新手。目前正在使用MVVM模式开发示例应用程序。我有一个列表视图,它填充了三列(Id,Name,Edit)。 在这里,每当用户单击编辑按钮时,他都会被重定向到带有预填充值的“编辑表单”(在列表视图中选中的项)。 编辑按钮绑定到ICommnad和im传递SelectedItem作为CommandParameter 我的问题是,每当ICommand激发时,它都会将以前选择的项作为SelectedItem来包含 你知道怎么解决这个问题吗 您可以在以下位置找到源代码:问题是在绑定引擎有机会更

我是WPF的新手。目前正在使用MVVM模式开发示例应用程序。我有一个
列表视图
,它填充了三列(
Id
Name
Edit
)。 在这里,每当用户单击编辑按钮时,他都会被重定向到带有预填充值的“编辑表单”(在
列表视图中选中的项)。
编辑按钮绑定到
ICommnad
和im传递
SelectedItem
作为
CommandParameter

我的问题是,每当
ICommand
激发时,它都会将以前选择的项作为
SelectedItem
来包含

你知道怎么解决这个问题吗


您可以在以下位置找到源代码:

问题是在绑定引擎有机会更新SelectedItem属性之前调用了button命令处理程序

首先,您有一些架构问题。将NavigateToForm放在EmpFormViewModel中是糟糕的SoC,我怀疑您这样做只是为了使绑定更容易声明。它实际上应该在父EmpViewModel中,类型为
RelayCommand

NavigateToForm=新的RelayCommand(vm=>
{
this.IsImportDataVisible=false;
this.IsSearchVisible=true;
//在这里对vm做些什么
});
然后,您所要做的就是修改button命令绑定以绑定到父级,并传入列表项。所以,替换所有这些

<Button Content="Edit" Command="{Binding NavigateToForm}">
    <Button.CommandParameter>
        <MultiBinding Converter="{StaticResource EditEmpConverter }">
            <!--<Binding Path="DataContext" ElementName="mainWindow"/>-->
            <Binding Path="SelectedItem"  ElementName="LstVw"/>
        </MultiBinding>
    </Button.CommandParameter>
</Button>

……关于这一点:

<Button Content="Edit" Command="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.NavigateToForm}" CommandParameter="{Binding}" />


请注意,我还从等式中删除了转换器,如果您确实需要克隆实例,请在ViewModel处理程序中执行此操作,至少可以更容易地对其进行测试。转换器是一个功能强大的工具,但它们经常被滥用,以补偿视图模型和视图之间的绑定不良。视图模型的主要职责是以视图易于使用的形式显示数据,如果您发现自己过于依赖数据或执行非常简单的任务(如此处的情况)然后,这通常是一个很好的迹象,表明视图模型没有正常工作。

进入列表视图并设置UpdateSourceTrigger=PropertyChanged,您可以告诉我,在CommandParameter中,u hv只写{Binding}…所以,这意味着它应该传递DataContext…它如何传递SelectedItem?它实际上没有传递SelectedItem,它正在当前数据上下文中传递。当您将ItemsControl/ListView/GridView等绑定到项目列表时,模板将绑定到各个列表项目,因此只需执行
CommandParameter=“{Binding}”
即可将相关项目传递到命令处理程序中。
<Button Content="Edit" Command="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.NavigateToForm}" CommandParameter="{Binding}" />