【问题标题】:Using controls with functionality with MVVM WP8 c#/xaml使用具有 MVVM WP8 c#/xaml 功能的控件
【发布时间】:2014-02-10 07:37:16
【问题描述】:

让我们举个例子。 WebBrowserTask 类为我们提供了打开指定 URL 的控制权。我们在我们的观点中定义它。如何在我们的视图模型中获得对该控件的引用?我们应该在视图中创建它并在后面的代码中使用“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() 和一个文本框。调用 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 类应该包含从 Internet 下载内容的逻辑,并且应该将其写入自定义控件,对吗?

Edit 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());
}

【问题讨论】:

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


    【解决方案1】:

    WebBrwoserTask 类不会在您的应用中定义的 Web 控件中打开指定的 URL。它会在手机的本机网络浏览器应用中打开它。

    您可以从 ViewModel 启动任务:

    WebBrowserTask task = new WebBrowserTask();
    task.Uri = new Uri("http://your-url-here");
    task.Show();
    

    【讨论】:

    • 啊,没错。所以这是一个致命的例子。在指定位置显示的控件(在 xaml 中定义的位置)呢?
    • 你应该使用 WebBrowser 控件然后:msdn.microsoft.com/en-us/library/windowsphone/develop/…
    • 我不同意这个答案,因为直接调用此任务会删除模拟支持。
    【解决方案2】:

    我没有正确理解您的问题,但您可能想从视图模型中显示一些东西吗? 您可以做一件事,通过返回值在 View Model 中制作一个标志,然后在 View 中访问它。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多