2012-08-09 3 views
0

Я устанавливаю DataContext для моего представления в конструкторе View в экземпляр моего ViewModel, только стандартного материала. Вскоре после этого произойдет событие . UPDATE_RECENT_DOCUMENTS_LIST Событие запускается из агрегатора событий, который мой ViewModel улавливает правильно. Свойство изменяется и вызывается метод onPropertyChanged, но он терпит неудачу, поскольку событие PropertyChanged равно null.Свойство PropertyChanged null после установки DataContext

Очень следующая вещь, которую я делаю, это действие к пользовательскому интерфейсу, который поднимает CREATE_PROJECT событий и тот же ViewModel получают события, только теперь, событие PropertyChanged уже не нулевое, и все работает, как ожидалось.

Есть ли определенное количество времени, которое должно пройти после установки DataContext до того, как оно зарегистрируется в Событии PropertyChanged? Есть ли событие, которое я могу дождаться, что событие PropertyChanged не является нулевым?

Кроме того, я не столкнулся с этой проблемой, используя стандартные .NET-события, сразу после интеграции Prism и использования очень удобного EventAggregator.

Я показываю свой код позади View и ViewModel, опуская View XAML для краткости.

ToolBarView.xaml.cs:

namespace ToolBarModule 
{ 

public partial class ToolBarView : UserControl 
    {       
     public ToolBarView(ToolBarViewModel toolBarViewModel) 
     { 
      InitializeComponent();    
      this.DataContext = toolBarViewModel;         
     }   
    } 
} 

ToolBarViewModel.cs

namespace ToolBarModule 
{ 

public class ToolBarViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private ToolBarCommands baseCommands; 
    private IEventAggregator eventAggregator; 

    private KickStartEvent kickStartEvent; 
    private SubscriptionToken subscriptionToken; 

    private ObservableCollection<IDocumentReference> recentDocuments = new ObservableCollection<IDocumentReference>(); 

    private ActionCommand newTest; 
    private ActionCommand openTest; 
    private ActionCommand saveTest;   
    private ActionCommand exitApplication; 

    public ToolBarViewModel(){} 

    public ToolBarViewModel(IEventAggregator eventAggregator) 
    { 
     this.eventAggregator = eventAggregator; 
     baseCommands = new ToolBarCommands(eventAggregator); 
     kickStartEvent = eventAggregator.GetEvent<KickStartEvent>(); 
     subscriptionToken = kickStartEvent.Subscribe(kickStartEventHandler, ThreadOption.UIThread, true, toolBarEventHandlerFilter);    
    } 

    public ICommand NewTest 
    { 
     get 
     { 
      if (newTest == null) 
      { 
       newTest = new ActionCommand(baseCommands.NewTestAction); 
      } 
      return newTest; 
     } 
    } 

    public ICommand OpenTest 
    { 
     get 
     { 
      if (openTest == null) 
      { 
       openTest = new ActionCommand(baseCommands.OpenTestAction); 
      } 
      return openTest; 
     } 
    } 

    public ICommand SaveTest 
    { 
     get 
     { 
      if (saveTest == null) 
      { 
       saveTest = new ActionCommand(baseCommands.SaveTestAction); 
      } 
      return saveTest; 
     } 
    } 


    public ICommand ExitApplication 
    { 
     get 
     { 
      if (exitApplication == null) 
      { 
       exitApplication = new ActionCommand(baseCommands.ExitApplicationAction); 
      } 
      return exitApplication; 
     } 
    } 

    public ObservableCollection<IDocumentReference> RecentDocuments 
    { 
     get 
     { 
      return recentDocuments; 
     } 

     set 
     { 
      recentDocuments = value; 
      onPropertyChanged("RecentDocuments"); 
     } 
    } 

    private void onPropertyChanged(string propertyChanged) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this,new PropertyChangedEventArgs(propertyChanged)); 
     } 

    } 

    private void kickStartEventHandler(KickStartEventsArgs e) 
    { 
     switch (e.EventType) 
     { 
      case KickStartEventsArgs.KickStartEventType.CREATE_PROJECT: 
       onPropertyChanged("RecentDocuments"); 
      break;     


      case KickStartEventsArgs.KickStartEventType.UPDATE_RECENT_DOCUMENTS_LIST: 
      RecentDocuments.Clear(); 

      foreach (IDocumentReference recentDocs in e.KickStartTestList) 
      { 
       RecentDocuments.Add(recentDocs); 
      } 
      onPropertyChanged("RecentDocuments"); 
      break; 
     } 
    } 
} 

}

+0

Вы назвали свой UserControl в XAML? – saber

+0

Предоставьте свой XAML вашего UserControl. – saber

+0

Создаете ли вы ToolBarView самостоятельно или используете Resolve или RegionManager? .... возможно, вам нужно подождать, пока элемент управления не будет загружен в дерево Visual ... т. Е. подождите, пока после события Loaded .... вы можете установить DataContext в ваше загруженное событие, если вам нравится –

ответ

0

Вы должны назвать ваш UserControl в XAML и использовать его в связывании. Что-то вроде следующего кода:

<UserControl x:Name="uc" > 
. 
. 
. 
<TextBox Text="{Binding UserName, Mode=TwoWay, ElementName=uc}"/> 

Где uc это имя вашего UserControl, а также попытаться установить DataContext, когда UserControl загружен.

Надеюсь, что эта помощь.

+0

My UserControl не указан, но после его именования событие PropertyChanged по-прежнему равно нулю. – estarkey7

+0

Вы установили ElementName привязок? – saber

+0

Все мои привязки работают нормально, это просто, что событие PropertyChanged равно null сразу после загрузки моего элемента управления. То, что я должен был сделать, задерживает отправку события около 500 мс, чтобы связать событие с событием PropertyChanged и устранить проблему. Спасибо за ваш вклад Sabre! – estarkey7

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