【发布时间】: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();
}
}
- 如何连接这些引用?
- 在我看来,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