我有以下情况:
UserControl.xaml
DoSomething()
我需要在某处调用usercontrol的UserControlViewModel.cs
方法。任何想法如何实现这一目标?
谢谢!
答案 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框架中的消息处理程序。