一种方法是拥有两个ViewModel,一个用于每个View / UserControl,然后将它们嵌套到某个顶层或更高级别的ViewModel中。例如,如果两个视图都驻留在MainWindow视图中,则可能如下所示:
public class MainWindowViewModel
{
public MainWindowViewModel(IRepository repository)
{
SharedUserControlData sharedData = new SharedUserControlData()
{
MyCollection = new ObservableCollection<MyEntity>(
repository.GetMyEntities()),
}
UserControl1ViewModel = new UserControl1ViewModel(sharedData);
UserControl2ViewModel = new UserControl2ViewModel(sharedData);
}
public UserControl1ViewModel UserControl1ViewModel { get; private set; }
public UserControl2ViewModel UserControl2ViewModel { get; private set; }
}
您有一个SharedUserControlData
类,其中包含两个视图都可以绑定到的属性:
public class SharedUserControlData : INotifyPropertyChanged
{
public ObservableCollection<MyEntity> MyCollection { get; set; }
}
用户控件的ViewModel会注入这些数据:
public class UserControl1ViewModel
{
public UserControl1ViewModel(SharedUserControlData data)
{
SharedUserControlData = data;
}
public SharedUserControlData SharedUserControlData { get; private set; }
}
您的用户控件视图通过DataTemplate与ViewModel绑定:
<DataTemplate DataType="{x:Type vm:UserControl1ViewModel}" >
<v:UserControl1View />
</DataTemplate>
// and the same for UserControl2ViewModel
有些UserControl中的控件绑定到SharedUserControlData.MyCollection
和其他UserControlViewModels属性。MainWindow的DataContext是MainWindowViewModel:
IRepository repository = new MyRepository();
MainWindow window = new MainWindow();
MainWindowViewModel viewModel = new MainWindowViewModel(repository);
window.DataContext = viewModel;
在您的MainWindow的XAML中,我们将UserControls绑定到MainWindow的DataContext(即MainWindowViewModel)的嵌套ViewModels。
<StackPanel>
<v:UserControl1View DataContext="{Binding UserControl1ViewModel}" />
<v:UserControl2View DataContext="{Binding UserControl2ViewModel}" />
</StackPanel>
这样,两个UserControls将拥有不同的ViewModels,但它们都共享来自包含两个UserControl's ViewModels的更高级别的ViewModel中的相同的SharedData实例。然后,Repository就可以访问EF数据上下文。(在这里拥有存储库只是一个示例,您还可以注入Service类的实例或其他内容。)