2014-12-19 74 views
0

我有2个视图和它们各自的视图模型。 我在这两个视图中都有一个按钮。 点击一个按钮,我必须从两个视图执行相同的命令。如何将一个命令绑定到wpf中的不同视图模型?

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

我有一个在视图模型中实现的命令接口。 execute方法必须根据数据上下文调用PerformSearch函数,即在两种视图模型中都有一个PerformSearch函数,并具有不同的实现。我如何从命令的execute方法调用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 
{ 

} 
+0

我不知道我的理解很好,但你可以传递参数如果工作特定于DataContext,那么您可以编写以下代码:

回答

0

添加PerformSearchIViewModel接口并调用它Execute()

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

public interface IViewModel 
{ 
    void PerformSearch(); 
} 

这意味着,当你ViewModels实现该接口可以提供不同的实现每个但界面是ViewModels你的命令执行的需要之间常见。

1

我觉得你很困惑。你已经说过,两个SearchTreeCommands根据他们的视图模型有不同的实现,所以他们分享的唯一东西就是名称,它们实际上并不相关。

而且你是在视图模型绑定属性名称,而不是一个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 ;-) 
} 
相关问题