如何将单个命令绑定到 wpf 中的不同视图模型

本文关键字:模型 视图 wpf 单个 命令 绑定 | 更新日期: 2023-09-27 18:34:45

我有 2 个视图及其各自的视图模型。我在两个视图中都有一个按钮。单击按钮时,我必须从两个视图中执行相同的命令。

<Button Command="{Binding SearchTreeCommand}" Content="Next"/>

我有一个在两个视图模型中实现的命令界面。执行方法必须根据数据上下文调用 PerformSearch 函数,即我在具有不同实现的两个视图模型中都有一个 PerformSearch 函数。如何从命令的执行方法调用 PerformSearch 的特定实现?

public class SearchTreeCommand : ICommand
{
    private readonly IViewModel m_viewModel;
    public SearchTreeCommand(IViewModel vm)
    {
        m_viewModel = vm;
    }
    event EventHandler ICommand.CanExecuteChanged
    {
        add { }
        remove { }
    }
    public void Execute(object param)
    {
        //how do I call the PerformSearch method here??
    }
    public bool CanExecute(object param)
    {
        return true;
    }
}
public interface IViewModel
{
}

如何将单个命令绑定到 wpf 中的不同视图模型

我想你很困惑。您说过,这两个SearchTreeCommand根据其视图模型具有不同的实现,因此它们唯一共享的是名称,它们实际上并不相关。

此外,您绑定到视图模型上的属性名称,而不是绑定到Type因此您的SearchTreeCommand类可以是您想要调用的任何内容。

这些意味着您可以做一些简单的事情,例如

//View Models
public class SimpleViewModel
{
  public ICommand SearchTreeCommand {get;set;}
}
//View 1 with a DataContext of new SimpleViewModel { SearchTreeCommand = new FirstImplementationOfSearchTreeCommand() }
<Button Command="{Binding SearchTreeCommand}" Content="Next"/>    
//View 2 with a DataContext = new SimpleViewModel { SearchTreeCommand = new SecondImplementationOfSearchTreeCommand() }
 <Button Command="{Binding SearchTreeCommand}" Content="Next"/>

或者,如果您需要在视图模型中进行更多差异化

//View 1 with a DataContext of new SimpleViewModel { SearchTreeCommand = new FirstImplementationOfSearchTreeCommand() }
<Button Command="{Binding SearchTreeCommand}" Content="Next"/>    
//View 2 with a DataContext = new ComplicatedViewModel { SearchTreeCommand = new SecondImplementationOfSearchTreeCommand() }
 <Button Command="{Binding SearchTreeCommand}" Content="Next"/>
//View Models
///<remarks>Notice I don't implement from anything shared with the SimpleView, no interface</remarks>
public class ComplicatedViewModel
{
  public ICommand SearchTreeCommand {get;set;}
  //I have other stuff too ;-)
}

PerformSearch添加到IViewModel接口并在Execute()中调用它。

public void Execute(object param)
{
    m_viewModel.PerformSearch();
}
public interface IViewModel
{
     void PerformSearch();
}

这意味着,当您的ViewModels实现接口时,您可以为每个接口提供不同的实现,但该接口在ViewModels之间是通用的,以满足您的 Command 实现的需求。