【问题标题】:Silverlight UserControl and his own Viewmodel hosted in a ViewSilverlight UserControl 和他自己的 Viewmodel 托管在 View 中
【发布时间】:2011-04-09 17:21:08
【问题描述】:
我想制作一个可重用的 UserControl:
- 具有自己的 VIEWMODEL 的 VIEW 逻辑数据恢复在哪里
- 此 UserControl(或 View ?)有一个按钮“OK”,用于在其视图模型中定位 RELAYCOMMAND
- 我将这个“UserControl”托管在另一个 VIEW(“MainPage”)中,她自己也有自己的视图模型
我的问题是:
如何使用我的 UC 概述的值来定位我的“MainPage”的 VIEWMODEL 属性?
【问题讨论】:
标签:
silverlight
user-controls
mvvm
【解决方案1】:
只要您的用户控件包含在您的主页中,它就会继承主页视图模型。这是默认设置,除非您通过数据绑定或代码显式更改数据上下文。
如果您的用户控件绑定到它自己的视图模型,那么您可以让主视图模型包含子视图模型的实例并通过公共属性公开它。现在,您可以通过将 DataContext 属性绑定到主视图模型上的属性来设置用户控件的数据上下文。
最后,如果您的子视图模型引用了主视图模型,那么它们将能够根据需要进行通信。
编辑:
我将尝试设置一个简单的示例:
首先是视图模型:
public class MainPageViewModel
{
public MainPageViewModel()
{
ChildViewModel = new ChildViewModel(this);
}
public ChildViewModel {get; private set; }
public ICommand OkCommand { get { // return the command here }}
}
public class ChildViewModel
{
private MainPageViewModel _parentViewModel;
public ChildViewModel(MainPageViewModel parentViewModel)
{
_parentViewModel = parentViewModel;
}
// Returns the command from the main page view model
public ICommand OkCommand { get { return _parentViewModel.OkCommand; } }
// Other properties as well
}
这里我们的主视图模型具有子视图模型作为属性。子视图模型公开了从主视图模型返回值的 OkCommand。
现在在您的主页 xaml 中,您可以执行以下操作:
<uc:MyUserControl DataContext="{Binding ChildViewModel}" />
在这里插入用户控件并将其数据上下文设置为子用户控件视图模型。