0

我有以下情况:

  1. 我有一个用户控件,比如说UserControl.xaml
  2. 在这个控件背后的代码中,我有方法DoSomething()
  3. 我有这个控件的视图模型UserControlViewModel.cs

我需要在DoSomething()某处调用 usercontrol 的方法。任何想法如何做到这一点?

谢谢!

4

3 回答 3

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; }
}
于 2013-04-10T08:22:43.797 回答
0

如果你在做 MVVM ,你真的应该使用 MVVM 框架。框架将提供一种机制,您可以通过该机制从视图中调用视图模型上的动词(方法)。例如, Caliburn.Micro提供Actions

于 2013-04-09T17:38:46.017 回答
0

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

做什么

DoSomething()

做,这对 ViewModel 的绑定属性的变化没有反应?

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

于 2013-04-10T08:36:57.393 回答