2014-11-25 3 views
2

При открытии файла клиента мне нужен clientId, который был выбран для указания того, какую запись следует запросить. Я пытаюсь открыть ViewModel как статический ресурс на странице, чтобы он мог быть легко доступен привязкой.Передача информации через viewmodels

Причина привязки к статическому ресурсу может быть найдена по этой ссылке. http://www.telerik.com/help/silverlight/gridview-troubleshooting-blank-cells.html

// Open an individual record when double-clicked. 
public void Open() 
{ 
    if (SelectedItem != null) 
    { 
     var vm = new LoanViewModel(Events); 
     vm.ById(SelectedItem.Id); 
     Events.PublishOnUIThread(new ShowTabEvent(vm)); 
    } 
    this.OnPropertyChanged("Items"); 
} 

LoanViewModel.cs

public LoanViewModel() 
{ .... Query needs LoanId} 

public void ById(int id) 
{} 

Более подробную информацию из этого связано Вопрос Having my Viewmodel appear in namespace dropdown

+0

Это прекрасный пример хорошего последующего вопроса. Спасибо, что не поставили старый вопрос хамелеона. Одно предложение (хотя его довольно очевидное, что вы хотите): включите ваш текущий XAML и то, что вы хотите, чтобы оно выглядело (даже если вы еще не знаете синтаксис). – BradleyDotNET

+0

На боковой ноте; У меня возникли проблемы с определением, что именно не так с тем, что у вас есть. Я понимаю * в основном * то, что вы хотите сделать; но не там, где у вас проблемы. – BradleyDotNET

+0

Спасибо @BradleyDotNET Итак, когда моя вкладка открыта через LoanViewModel(), я получаю много нулевых ссылок, потому что creditID не был установлен. Вот почему мне нужен кредит. – Master

ответ

0

Во-первых, вы не должны делать операцию запроса в конструкторе 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 может быть другим, идея такая же

+0

Мне нравится ваш подход, единственная проблема в том, что это одна модель Viewmodel. Не два.Не уверен, что он будет иметь тот же эффект /. – Master

Смежные вопросы