2016-04-04 6 views
-1

Я хочу создать мероприятие и подписаться на другой ViewModel. Обработчик события всегда получает нулевое значение для первого ViewModel. В первом ViewModel я объявил событие и вырос следующийEventHandler всегда имеет значение null?

public event EventHandler EditSearchChanged; 

и поднял, как

 if (EditSearchChanged != null) 
     { 
      EditSearchChanged(this, null); 
     } 

Во втором ViewModel, я объявил свойство первой ViewModel.

private EditTileViewModel editTileVM; 

    public EditTileViewModel EditTileVM 
    { 
     get 
     { 
      return editTileVM ?? (editTileVM = new EditTileViewModel()); 
     } 
     set 
     { 
      editTileVM = value; 
      RaisePropertyChanged(); 
     } 
    } 

и подписаться на событие следующим образом

EditTileVM.EditSearchChanged += EditTileVM_EditSearchChanged; 

    private void EditTileVM_EditSearchChanged(object sender, EventArgs e) 
    { 
     this.EditTileVM = (sender as EditTileViewModel); 
    } 

Debugger Результат enter image description here

+0

Здесь EditSearchChanged является нулевым – subminer

+0

Возможно ли, что линия 'EditTileVM.EditSearchChanged + = EditTileVM_EditSearchChanged;' никогда не выполняется, и поэтому никогда не устанавливается? Может быть, еще немного кода? – mnemonic

+1

вы можете поместить отладчик в 'EditTileVM.EditSearchChanged + = EditTileVM_EditSearchChanged' и проверить, запущен ли он? – Rohit

ответ

0

Это происходит, когда вы создаете еще один новый экземпляр ViewModel следующим свойством:

private EditTileViewModel editTileVM; 
public EditTileViewModel EditTileVM 
{ 
    get 
    { 
     return editTileVM ?? (editTileVM = new EditTileViewModel()); 
    } 
    set 
    { 
     editTileVM = value; 
     RaisePropertyChanged(); 
    } 
} 

Таким образом, есть две установки nces EditViewModel.

Я предлагаю вам использовать EventAggregator pattern между двумя viewModels из рамок Prism:

// Subscribe 
eventAggregator.GetEvent<CloseAppliactionMessage>().Subscribe(ExitMethod); 

// Broadcast 
eventAggregator.GetEvent<CloseAppliactionMessage>().Publish(); 

Пожалуйста, смотрите очень хороший учебник Рэйчел Лим о simplified Event Aggregator pattern.

Или используйте MVVM Light messenger:

//Subscribe 
Messenger.Default.Register<CloseAppliactionMessage>(ExitMethod); 

// Broadcast 
Messenger.Default.Send<CloseAppliactionMessage 
+0

@subminer не стесняйтесь задавать любые вопросы. Если вы чувствуете, что мой ответ помогает вам, вы можете отметить мой ответ как ответ, чтобы упростить будущий поиск других людей. Пожалуйста, прочтите это http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – StepUp