使用具有MVVM WP8 c#/ xaml功能的控件

时间:2014-02-10 07:37:16

标签: c# xaml mvvm windows-phone-8

我们举一个例子。 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();
  }
}
  1. 如何连接这些参考文献?
  2. 在我看来,InternetService类应该包含从互联网上下载内容的逻辑,应该把它写入自定义控件吗?对不起?
  3. 编辑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());
    }
    

3 个答案:

答案 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)

这取决于您使用的框架。您可以使用委托,服务或消息来抽象出任务。您不应该将它放在视图中,也不应该直接从视图模型中调用它,因为它不可模拟。