我遇到了在UserControl上调用方法的问题。听我说:
我在SomeView.xaml中有一个UserControl someControl
SomeView.xaml的DataContext是SomeViewModel.cs
我希望能够以某种方式在某处调用someControl.DoStuff()
。
DoStuff不是特定于UI的(我可以从SomeView.Xaml.Cs的代码隐藏中调用DoStuff,如果它是特定于UI的,但在这种情况下,它可能不是。)
有什么想法吗?
谢谢!
答案 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) 显示。