我们举一个例子。 WebBrowserTask类为我们提供了在控件中打开指定的URL。我们在视图中定义它。如何在viewmodel中引用该控件?我们应该在视图中创建它并在后面的代码中使用“webBrowserTaskInstance.Show()”吗?或者是否可以在MVVM模式中使用“Show()”函数?
编辑:WebBrowserTask的示例错误。让我们再看一个例子:
public class MainViewModel
{
private IInternetService _internetService;
public MainViewModel(IInternetService internetService)
{
_internetService = internetService;
}
RelayCommand ComputeCommand
{
get
{
blablabla -> _internetService.Compute();
}
}
}
现在在我的MainView.xaml中:
<namespace:InternetControl x:Name="MyControl" />
假设InternetControl有一个函数Compute()和单个Textbox。在调用Compute()后,它会从Internet获取一些内容并写入该TextBox。
我希望我的ComputeCommand调用指定的服务(在这里是IInternetService),该实现包装我的控件并在其上调用Compute - 例如:
public class InternetService : IInternetService
{
InternetControl internetControl; // how to spare reference to it with my control in view?
public void Compute()
{
internetControl.Compute();
}
}
编辑2 - 这是解决方案,但在我看来,控制应该与ViewModel无关,我是对的吗? 视图模型:
public ICommand ResetCommand {get; set;}
来自UserControl的OnLoad方法:
private void MyUserControl_Loaded(object sender, RoutedEventArgs e)
{
MyUserControl ctrl = sender as MyUserControl;
if (ctrl == null) return;
MyViewModel vm = ctrl.DataContext as MyViewModel ;
if (vm == null)
return;
vm.ResetCommand = new RelayCommand(param => this.Reset());
}
答案 0 :(得分:1)
WebBrwoserTask
类不会在您应用中定义的Web控件中打开指定的URL。它会在手机的原生网络浏览器应用程序中打开它。
您可以从ViewModel启动任务:
WebBrowserTask task = new WebBrowserTask();
task.Uri = new Uri("http://your-url-here");
task.Show();
答案 1 :(得分:0)
我没有正确地回答您的问题,但您可能希望从视图模型中显示某些内容? 你可以做一件事传递返回值在View Model中制作一个标志,然后在View中访问它。
答案 2 :(得分:0)
这取决于您使用的框架。您可以使用委托,服务或消息来抽象出任务。您不应该将它放在视图中,也不应该直接从视图模型中调用它,因为它不可模拟。