ICommand 覆盖 SelectedItem

ICommand overriding SelectedItem

我是 WPF 新手。目前正在使用 MVVM 模式开发示例应用程序。我有一个 ListView,它填充了三列(IdNameEdit)。 在这里,每当用户点击“编辑”按钮时,他将被重定向到 "Edit form" 并使用预先填充的值(ListView 中的选定项目)。 编辑按钮绑定到 ICommnad 并且我将 SelectedItem 作为 CommandParameter.

传递

我的问题是每当 ICommand 触发时它包含先前选择的项目 SelectedItem

知道如何解决这个问题吗?

您可以在以下位置找到源代码:https://github.com/4pawan/WPF_Sample

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

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

        NavigateToForm = new RelayCommand<EmpFormViewModel>(vm =>
        {
            this.IsImportDataVisible = false;
            this.IsSearchVisible = true;

            //do something with vm here
        });

然后您所要做的就是修改您的按钮命令绑定以改为绑定到父级并传入列表项。所以替换所有这些...

<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 处理程序中进行,至少可以更轻松地对其进行测试。转换器是一个强大的工具,但它们经常被滥用来补偿视图模型和视图之间的不良绑定。视图模型的主要职责是以视图可以轻松使用的形式呈现数据,如果您发现自己过于依赖它们或执行非常简单的任务(例如此处的情况),那么它通常是一个很好的选择表明视图模型没有正常工作。