在MVVM中调用UserControl的方法

时间:2010-09-13 23:56:07

标签: wpf mvvm

我遇到了在UserControl上调用方法的问题。听我说:

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

  2. SomeView.xaml的DataContext是SomeViewModel.cs

  3. 我希望能够以某种方式在某处调用someControl.DoStuff()

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

  5. 有什么想法吗?

    谢谢!

7 个答案:

答案 0 :(得分:5)

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

我唯一能想到的是你可能希望实现某种类型的消息传递(就像它们在MVVM Light中那样)可以触发执行。

要么是这样,要么重新考虑如何构建代码。

答案 1 :(得分:3)

听起来您希望DoStuff响应VM中的某些数据或逻辑而发生,在这种情况下,最干净的方法可能是使用源自VM并由DoStuff处理的事件。如果触发器更像是状态更改,您还可以将相应的VM数据绑定到UserControl上的新依赖项属性,并从DP的更改处理程序调用DoStuff。

答案 2 :(得分:3)

通过使用Mert {{回答的操作代理来解析ViewModel关于查看的知识,解决了这个的答案3}}

如果链接中断,那么在此处粘贴他的代码。

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
    }
}

答案 3 :(得分:0)

在MVVM设计中,通常的想法是在UserControl(xaml.cs文件)中没有任何代码(在理想的世界中)。 UI和ViewModel之间的所有交互都应该通过命令和绑定来处理...那么为什么你的用户控件需要DoStuff?

你可能有像

这样的东西
<Button Command="{Binding myCommandOnTheDataContextViewModel}" Content="{Binding somePropertyOnTheViewModel}" />

答案 4 :(得分:0)

也许你的UserControl应该是一个View,然后它应该有一个ViewModel,它将包含DoStuff()方法。 SomeViewModel将实例化(租用casuse实例化)SomeControlViewModel,因此能够在其上调用方法。

答案 5 :(得分:0)

如果您具有View-first方法(并且您的VM在XAML中被实例化为Resource),您可以使用一些正常事件将您的控制DoStuff方法与VM上的某些事件(在Loaded事件上)连接。

答案 6 :(得分:0)

如果方法是DoStuff();做一些UI特定的逻辑,然后方法是在正确的位置。如果没有那么它应该在另一个对象中(例如SomeViewModel)。

当SomeViewModel通过接口分离时,允许在SomeView上调用方法。如何实现这一点由 WPF Application Framework (WAF) 显示。