MissingMethodException в NotifyPropertyChanged в приложении локальной базы данных для Windows Phone 7

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

В моем приложении у меня есть объект в таблице, который реализует реализованные интерфейсы 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, так что это может быть очевидно, но не для меня)

РЕДАКТИРОВАТЬ: больше информации

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

    // 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"); по-прежнему дает то же исключение. (и «метод» получает значение null при проверке типа отладки)

РЕДАКТИРОВАТЬ:

Трассировки стека:

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)

person Bill    schedule 29.04.2012    source источник
comment
Что вы пытаетесь сделать с отражением в методе NotifyPropertyChanging?   -  person Metro Smurf    schedule 30.04.2012
comment
С кодом происходит что-то еще; все, что вы написали, будет работать. Можете ли вы опубликовать трассировку стека?   -  person Metro Smurf    schedule 30.04.2012
comment
Я пытался показать, что когда я проверяю проблему с помощью отладки, я вижу, что метод, который, как утверждается, отсутствует, посредством отражения (моя переменная «методы» имеет геттер и сеттер для «LastViewDate»). Я предполагаю, что фреймворк подписывается на мое событие PropertyChanging, а затем падает, когда пытается использовать отражение для доступа к свойству. (по какой-то причине фреймворк не может видеть свойство, как я, и вылетает - вот почему я запутался...)   -  person Bill    schedule 30.04.2012
comment
У меня есть подозрение, что это связано с System.Data.Linq. Случайно у вашего класса нет пустого конструктора? т. е. public YourClass(){}, а не public YourClass(SomeType someType){}. Если нет, добавьте пустой конструктор и посмотрите, устранит ли это ошибку.   -  person Metro Smurf    schedule 30.04.2012


Ответы (2)


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

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

Спасибо @Metro Smurf и @Rajeev Nair за то, что они это поняли.

person Bill    schedule 30.04.2012

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

person Rajeev Nair    schedule 30.04.2012
comment
да: публичное событие PropertyChangingEventHandler PropertyChanging; - person Bill; 30.04.2012
comment
Вы можете опубликовать все сообщение об исключении? - person Rajeev Nair; 30.04.2012
comment
См. комментарий @Metro Smurf. Добавьте пустой конструктор, и он должен работать. - person Rajeev Nair; 30.04.2012