Одним из подходов может быть наличие двух ViewModel, по одному для каждого из ваших Views / UserControls, а затем вложение их в какую-либо ViewModel верхнего или более высокого уровня. Например, если оба представления находятся в представлении MainWindow, это может выглядеть следующим образом:
public class MainWindowViewModel
{
public MainWindowViewModel(IRepository repository)
{
SharedUserControlData sharedData = new SharedUserControlData()
{
MyCollection = new ObservableCollection<MyEntity>(
repository.GetMyEntities()),
// instantiate other shared data properties
}
UserControl1ViewModel = new UserControl1ViewModel(sharedData);
UserControl2ViewModel = new UserControl2ViewModel(sharedData);
}
public UserControl1ViewModel UserControl1ViewModel { get; private set; }
public UserControl2ViewModel UserControl2ViewModel { get; private set; }
// more stuff...
}
У вас есть класс SharedUserControlData
, который содержит свойства, к которым могут привязываться оба представления:
public class SharedUserControlData : INotifyPropertyChanged
{
public ObservableCollection<MyEntity> MyCollection { get; set; }
// other properties
// INotifyPropertyChanged implementation
}
И ViewModel из UserControls вводят эти данные:
public class UserControl1ViewModel
{
public UserControl1ViewModel(SharedUserControlData data)
{
SharedUserControlData = data;
}
public SharedUserControlData SharedUserControlData { get; private set; }
// more stuff
}
// and the same for UserControl2ViewModel
Ваши представления UserControl привязаны к моделям представления с помощью шаблона данных:
<DataTemplate DataType="{x:Type vm:UserControl1ViewModel}" >
<v:UserControl1View />
</DataTemplate>
// and the same for UserControl2ViewModel
А некоторые элементы управления внутри UserControls связаны затем с SharedUserControlData.MyCollection
и другими свойствами UserControlViewModels. DataContext MainWindow - это MainWindowViewModel:
IRepository repository = new MyRepository(); // or use Dependency Injection
MainWindow window = new MainWindow();
MainWindowViewModel viewModel = new MainWindowViewModel(repository);
window.DataContext = viewModel;
В XAML вашего MainWindow мы связываем UserControls с вложенными ViewModels DataContext MainWindow (который является MainWindowViewModel):
<StackPanel>
<v:UserControl1View DataContext="{Binding UserControl1ViewModel}" />
<v:UserControl2View DataContext="{Binding UserControl2ViewModel}" />
</StackPanel>
Таким образом, оба UserControls будут иметь разные ViewModel, но оба будут использовать один и тот же экземпляр SharedData, который поступает из ViewModel более высокого уровня, содержащего оба ViewModels UserControl. Затем репозиторий получает доступ к контексту данных EF. (Наличие репозиториев здесь - только пример, вы также можете добавить экземпляры классов Service или что-то в этом роде.)