0

Я следовал учебник MSDN в качестве ссылки, делая приложение MVC для Winows Phone 7.1: http://msdn.microsoft.com/en-us/library/hh286405(v=vs.92).aspxMissingMethodException на NotifyPropertyChanged в локальном приложении базы данных для Windows Phone 7

В моем приложении, у меня есть объект в таблица, которая реализует интерфейсы INotifyPropertyChanging и INotifyPropertyChanged реализованы и свойства, как это:

private DateTime lastViewDate; 
[Column] 
public DateTime LastViewDate 
{ 
    get { return lastViewDate; } 
    set 
    { 
     if (lastViewDate != value) 
     { 
      NotifyPropertyChanging("LastViewDate"); 
      lastViewDate = value; 
      NotifyPropertyChanged("LastViewDate"); 
     } 
    } 
} 

когда LastViewDate свойство получает изменен, MissingMethodException выкинут, когда NotifyPropertyChanging вызывается, хотя свойство, очевидно, есть. Так что я делаю неправильно? (я нуб в WP7 программирования, так что может быть очевидно, просто не для меня)

EDIT: подробнее

Вот метод интерфейса с некоторыми дополнительными вызовами для изучения методов:

// Used to notify that a property is about to change 
    private void NotifyPropertyChanging(string propertyName) 
    { 
     var type = this.GetType(); 
     var method = type.GetMethod(propertyName); // null 
     var getMethod = type.GetMethod("get_" + propertyName); // works 
     var setMethod = type.GetMethod("set_" + propertyName); // works 
     var methods = type.GetMethods(); // set_LastViewDate is in the method list 
     // 
     if (PropertyChanging != null) 
     { 
      PropertyChanging(this, new PropertyChangingEventArgs(propertyName)); 
     } 
    } 

Изменение вызова NotifyPropertyChanging ("set_LastViewDate"); все же дает то же исключение. (И '' метод получает нуль в проверке отладки типа)

EDIT:

Стек след:

System.MissingMethodException was unhandled 
Message=MissingMethodException 
StackTrace: 
    at System.Activator.InternalCreateInstance(Type type, Boolean nonPublic, StackCrawlMark& stackMark) 
    at System.Activator.CreateInstance(Type type) 
    at System.Data.Linq.WorkAround.ActivationHelper.CreateInstance(Type type) 
    at System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.CreateDataCopy(Object instance) 
    at System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.StartTracking() 
    at System.Data.Linq.ChangeTracker.StandardChangeTracker.OnPropertyChanging(Object sender, PropertyChangingEventArgs args) 
    at WindowsPhonePlaces.Photo.NotifyPropertyChanging(String propertyName) 
    at WindowsPhonePlaces.Photo.set_LastViewDate(DateTime value) 
    at WindowsPhonePlaces.Photo.ResetViewDate() 
    at WindowsPhonePlaces.PhotoViewerPage.OnNavigatedTo(NavigationEventArgs e) 
    at Microsoft.Phone.Controls.PhoneApplicationPage.InternalOnNavigatedTo(NavigationEventArgs e) 
    at System.Windows.Navigation.NavigationService.RaiseNavigated(Object content, Uri uri, NavigationMode mode, Boolean isNavigationInitiator, PhoneApplicationPage existingContentPage, PhoneApplicationPage newContentPage) 
    at System.Windows.Navigation.NavigationService.CompleteNavigation(DependencyObject content, NavigationMode mode) 
    at System.Windows.Navigation.NavigationService.ContentLoader_BeginLoad_Callback(IAsyncResult result) 
    at System.Windows.Navigation.PageResourceContentLoader.BeginLoad_OnUIThread(AsyncCallback userCallback, PageResourceContentLoaderAsyncResult result) 
    at System.Windows.Navigation.PageResourceContentLoader.<>c__DisplayClass4.<BeginLoad>b__0(Object args) 
    at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark) 
    at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark) 
    at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 
    at System.Delegate.DynamicInvokeOne(Object[] args) 
    at System.MulticastDelegate.DynamicInvokeImpl(Object[] args) 
    at System.Delegate.DynamicInvoke(Object[] args) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority) 
    at System.Windows.Threading.Dispatcher.OnInvoke(Object context) 
    at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args) 
    at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args) 
    at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult) 
+0

Что вы пытаетесь сделать с отражением в методе «NotifyPropertyChanging»? –

+0

Что-то еще происходит с кодом; все, что вы разместили, будет работать. Можете ли вы опубликовать трассировку стека? –

+0

Я пытался показать, что, когда я проверяю проблему с помощью отладки, я вижу, что метод, который, по его утверждению, отсутствует через отражение (моя переменная методов имеет getter и setter для «LastViewDate»). Я предполагаю, что структура подписывается на мое событие PropertyChanging, а затем сбой, когда он пытается использовать отражение для доступа к свойству. (по какой-то причине структура не может видеть свойство, как я могу, и сбой - вот почему я запутался ...) – Bill

ответ

1

Я ставлю решение как отдельный ответ здесь, чтобы понять:

Проблема заключалась в том, что я сделал конструктор приватным и используется статический метод для создания своих объектов БД. Это не работает с LINQ - вам нужен безпараллельный публичный конструктор.

Благодаря @Metro Smurf и @ Rajeev Nair для выяснения этого.

0

ли PropertyChanging объявлен общественности? Если нет, он должен быть установлен как открытый.

+0

yes: public event PropertyChangingEventHandler PropertyChanging; – Bill

+0

Можете ли вы опубликовать все сообщение об исключении? –

+0

См. Комментарий @Metro Smurf. Добавьте пустой конструктор, и он должен работать. –