WPF объявление глобального свойства с использованием её в нескольких ViewModel
При создании насыщенного MVVM приложения появилась необходимость разделения MainViewModel, отвечающей за модель представления главного окна, на несколько частей. Имеются также зависимые ViewModels (содержат и UserControls), зарегистрированные через сервис-локатор (используется MicrosoftExtensionsHosting):
DataContext="{Binding MainWindowModel, Source={StaticResource Locator}}"
internal class ViewModelLocator
{
public MainWindowViewVM MainWindowModel =>
App.Host.Services.GetRequiredService<MainWindowViewModel>();
public UserControlViewVM UserControlWindowModel =>
App.Host.Services.GetRequiredService<UserControlViewModel>();
}
public static void ConfigureServices(HostBuilderContext host, IServiceCollection services) => services
.RegisterServices()
.RegisterViewModels();
Вопрос: где и как я должен объявить глобальное свойство MyProperty, к которому должны иметь доступ все ViewModels. Может в рамках использования HostBuilder'a также нужно объявить что-то навроде "RegisterGlovalProperties" или что-то в этом духе, чтобы происходило автоматическое внедрение зависимостей?
- Объявлять свойство в MainWindowVIewModel с целью последующей передачи как DataContext в UserControlViewModel наверное неправильно, т.к. могут быть еще отдельные полноценные окна, а не только UserControl-элементы.
- Правильно ли будет объявить это свойство в файле App.xaml.cs и затем внедрять его во все ViewModels, в т.ч. и в MainViewModel или просто получать к нему доступ через обращение к App.Current?
- Еще есть вариант внедрять требуемое свойство в DependencyProperty UserControl ViewModel.
- Наиболее удачное решение, которое мне пришло в голову, это в конструкторе UserControl (в Code behind) с собственной ViewModel, обращаться к public-свойствам в MainViewModel через запрос реализации MainViewModel у сервис-локатора и последующего сохранения нужных свойств уже в ViewModel'и UserControl'а. Но так возникает сильная связь (одна ViewModel знает о другой ViewModel), от чего хотелось бы избавиться:
public UserControlView()
{
var locator = App.Current.Resources["Locator"];
UserControlWindowVM userControlWindowVM = ((ViewModelLocator)locator).UserControlWindowVM ;
MainWindowViewModel mainWindowVM = ((ViewModelLocator)locator).MainWindowVM;
this.MyProperty = mainWindowVM.MyProperty;
InitializeComponent();
}