Я устанавливаю 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;
}
}
}
}
Вы назвали свой UserControl в XAML? – saber
Предоставьте свой XAML вашего UserControl. – saber
Создаете ли вы ToolBarView самостоятельно или используете Resolve или RegionManager? .... возможно, вам нужно подождать, пока элемент управления не будет загружен в дерево Visual ... т. Е. подождите, пока после события Loaded .... вы можете установить DataContext в ваше загруженное событие, если вам нравится –