在MVVM中调用UserControl的方法

LB.*_*LB. 9 wpf mvvm

我在UserControl上调用方法时遇到问题.听我说:

  1. someControl在SomeView.xaml中有一个UserControl

  2. SomeView.xaml的DataContext是SomeViewModel.cs

  3. 我希望能够以someControl.DoStuff()某种方式在某个地方打电话.

  4. DoStuff不是特定于UI的(我可以从SomeView.Xaml.Cs的代码隐藏中调用DoStuff,如果它是特定于UI的,但在这种情况下,它可能不是.)

有任何想法吗?

谢谢!

Rob*_*cus 5

您可能不会喜欢这个答案,但您的ViewModel应该不了解您的UI.如果您的UserControl上有非UI方法,则可能位于错误的位置.

我唯一能想到的是你可能想要实现一些可能触发执行的消息传递(就像他们在MVVM Light中一样).

它要么是,要么重新考虑如何构建代码.


Sai*_*Sai 5

通过解耦 ViewModel 关于 View 的知识来实现​​此目的的一个答案是使用Mert 在这里回答的Action 委托

如果链接有任何问题,请将他的代码粘贴到此处。

class MyCodeBehind
{
   public MyCodeBehind()
   {
      Action action = new Action(()=> this.SomeMethodIWantToCall());
      var myVM = new MyVM(action); // This is your ViewModel
      this.DataContext = myVM;
   }

   private void SomeMethodIWantToCall(){...}
}

class MyVM
{
    private Action action;

    public MyVM(Action someAction)
    {
       this.action = someAction;
    }

    private void SomeMethodInVM()
    {
        this.action(); // Calls the method SomeMethodIWantToCall() in your code behind
    }
}
Run Code Online (Sandbox Code Playgroud)