Во-первых, вы не должны делать операцию запроса в конструкторе ViewModels. Вы не должны выполнять «дорогостоящую» операцию внутри конструктора класса.
Во-вторых, ViewModels не должны знать о других моделях ViewModels. Поэтому вы не должны создавать экземпляр ViewModel в другой ViewModel.
Я бы предложил другой подход. Вместо того, чтобы пытаться напрямую передать идентификатор в ViewModel, сделайте это через агрегатор событий. Event Aggregator - это, в основном, система обмена сообщениями для отправки сообщений развязанным способом между ViewModels.
One ViewModel зарегистрировался на определенном событии, другой ViewModel отправил его, не зная, есть ли у него какой-либо подписчик или кто этот подписчик может быть. Например, PRISM IEventAggregator
.
Вы получаете экземпляр EventAgregator вашего выбора в вашей ViewModel (либо Dependency Injection или через Service Locator) и зарегистрировать событие в конструкторе
public class LoanViewModel
{
public LoanViewModel()
{
IEventAggregator events = ... ; // get via ServiceLocator or via Constructor for DI
events.GetEvent<CustomerLoadedEvent>().Subscribe(OnCustomerLoaded);
}
private void OnCustomerLoaded(Customer customer)
{
int customerId = customer.ID;
// do your query now
}
}
public class OtherViewModel
{
IEventAggregator events;
public LoanViewModel()
{
this.events; = ... ; // get via ServiceLocator or via Constructor for DI
}
// Should be ICommand for WPF binding...assuming SelectedItem is from type Customer
public void Open()
{
if (SelectedItem != null)
{
events.GetEvent<CustomerLoadedEvent>().Publish(SelectedItem);
}
this.OnPropertyChanged("Items");
}
}
Таким образом, ваши ViewModels полностью независимы друг от друга Другие.
Конечно, PRISM/CompositeFramework может немного переборщить за то, что вам нужно. Вы можете использовать другие, более простые агрегаторы событий или создать свой собственный. Api может быть другим, идея такая же
Это прекрасный пример хорошего последующего вопроса. Спасибо, что не поставили старый вопрос хамелеона. Одно предложение (хотя его довольно очевидное, что вы хотите): включите ваш текущий XAML и то, что вы хотите, чтобы оно выглядело (даже если вы еще не знаете синтаксис). – BradleyDotNET
На боковой ноте; У меня возникли проблемы с определением, что именно не так с тем, что у вас есть. Я понимаю * в основном * то, что вы хотите сделать; но не там, где у вас проблемы. – BradleyDotNET
Спасибо @BradleyDotNET Итак, когда моя вкладка открыта через LoanViewModel(), я получаю много нулевых ссылок, потому что creditID не был установлен. Вот почему мне нужен кредит. – Master