我有以下情况:
- 我有一个用户控件,比如说
UserControl.xaml
- 在这个控件背后的代码中,我有方法
DoSomething()
- 我有这个控件的视图模型
UserControlViewModel.cs
我需要在DoSomething()
某处调用 usercontrol 的方法。任何想法如何做到这一点?
谢谢!
我有以下情况:
UserControl.xaml
DoSomething()
UserControlViewModel.cs
我需要在DoSomething()
某处调用 usercontrol 的方法。任何想法如何做到这一点?
谢谢!
如果我真的必须这样做,那么使用 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; }
}
如果你在做 MVVM ,你真的应该使用 MVVM 框架。框架将提供一种机制,您可以通过该机制从视图中调用视图模型上的动词(方法)。例如, Caliburn.Micro提供Actions。
听起来您的应用程序结构不正确。
做什么
DoSomething()
做,这对 ViewModel 的绑定属性的变化没有反应?
如果您确实需要从 ViewModel 触发 View 背后的代码中的某些内容,请使用消息处理程序,例如Galasoft MVVMLight框架中的处理程序。