在MVVM中的某个地方调用UserControl的方法

时间:2013-04-09 16:42:38

标签: wpf mvvm user-controls

我有以下情况:

  1. 我有一个用户控件,比方说UserControl.xaml
  2. 在此控件的代码后面,我有方法DoSomething()
  3. 我有此控件{view 1}
  4. 的viewmodel

    我需要在某处调用usercontrol的UserControlViewModel.cs方法。任何想法如何实现这一目标?

    谢谢!

3 个答案:

答案 0 :(得分:1)

如果我真的必须这样做,那么使用DataContextChanged事件可能有所帮助。 这是一个解决方案,希望视图和视图模型之间的耦合最小。

public partial class MainWindow : IMainWindow
{
    public MainWindow()
    {
        this.DataContextChanged += this.MainWindowDataContextChanged;

        this.InitializeComponent();
    }

    private void MainWindowDataContextChanged(object sender, 
                     DependencyPropertyChangedEventArgs e)
    {
        var vm = this.DataContext as IMainWindowViewModel;
        if (vm != null)
        {
            vm.View = this;
        }
    }

    public void DoSomething()
    {
        Debug.WriteLine("Do something in the view");
    }
}

public interface IMainWindow
{
    void DoSomething();
}

public class MainWindowViewModel : IMainWindowViewModel
{
    public MainWindowViewModel()
    {
        this.DoSomethingCommand = new RelayCommand(this.DoSomething);
    }

    public ICommand DoSomethingCommand { get; set; }

    private void DoSomething()
    {
        Debug.WriteLine("Do something in the view model");

        var view = this.View;
        if (view != null)
        {
            view.DoSomething();
        }
    }

    public IMainWindow View { get; set; }
}

public interface IMainWindowViewModel
{
    IMainWindow View { get; set; }
}

答案 1 :(得分:0)

你真的应该是using an MVVM framework if you're doing MVVM。框架将提供一种机制,您可以从视图中调用视图模型上的动词(方法)。例如Caliburn.Micro提供Actions

答案 2 :(得分:0)

听起来你的应用程序结构不正确。

什么是

DoSomething()

是否,这不会对ViewModel的绑定属性的更改做出反应?

如果您确实需要在ViewModel的View后面的代码中触发某些内容,请使用消息处理程序,例如Galasoft MVVMLight框架中的消息处理程序。