Windows 8.1 개발 과정에서 발생한 사소한 문제

5789 단어 windows
최근에 Windows 8 응용 프로그램을 개발할 때 알 수 없는 문제에 부딪혔습니다. 오류 내용은 다음과 같습니다. (그 중에서 **.DLL은 로컬에서 만든 프로젝트이고 메인 프로젝트에 인용을 추가했습니다. 그 중 대부분 코드는 MVVM light 프레임워크 라이브러리의 코드입니다)
 
System.InvalidCastException 유형의 예외는 **.DLL이 발생했지만 사용자 코드에서 처리되지 않았습니다.
추가 정보: Unable to cast COM object of type'System.ComponentModel.PropertyChangedEventHandler' to class type 'System.ComponentModel.PropertyChangedEventHandler'. Instances of types that represent COM components cannot be cast to types that do not represent COM components; however they can be cast to interfaces as long as the underlying COM component supports QueryInterface calls for the IID of the interface.
전제는:charm란에서 공유를 선택하고 공유된 응용을 선택한다.정상적으로 앱을 시작하면 괜찮을 겁니다.(나는 왜 대신의 가르침을 갈망하는지 궁금하다)
 
오류 코드는 여기입니다 (빨간색 글꼴 부분):
[SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate",
            Justification = "This cannot be an event")]
        protected virtual void RaisePropertyChanged(string propertyName)
        {
#if WIN8
            if (string.IsNullOrEmpty(propertyName))
            {
                throw new NotSupportedException(
                    "Raising the PropertyChanged event with an empty string or null is not supported in the Windows 8 developer preview");
            }
            else
            {
#endif
                //VerifyPropertyName(propertyName);

                var handler = PropertyChangedHandler;

                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
#if WIN8
            }
#endif
        }

 
프레임워크 자체의 문제인 줄 알고 해당 코드에서 INotifyPropertyChanged 인터페이스를 다시 실현하고 이 인터페이스를 실현한다.
    public class LoginViewModel : ViewModelBase,INotifyPropertyChanged
    {
        event PropertyChangedEventHandler PropertyChanged;
        void NotifyPropertyChanged(string name)
        {
            if (PropertyChanged != null)
                PropertyChanged(this,new PropertyChangedEventArgs(name);
        }
    }

나는 관련 댓글을 보고 이 답장을 보았다.
Just cast it to  INotifyCollectionChanged
var collectionChanged = propertyObject as INotifyCollectionChanged;
if (collectionChanged != null)
    collectionChanged.CollectionChanged += ...

于是我修改代码为如下:
    public class LoginViewModel : ViewModelBase,INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        void NotifyPropertyChanged(string name)
        {
            var obj = this as INotifyPropertyChanged;
            if (obj != null)
                obj.PropertyChanged += (s, e) => {
                    PropertyChanged(s, new PropertyChangedEventArgs(name));
                };
        }
    }    

OK, 문제 해결, 관건은 누가 나에게 왜, 어떤 상황에서 이 오류가 발생했는지, 왜 공유에서 발생했는지, 정상적인 상태에서 이 오류가 발생하지 않았는지 알려줄 수 있는가?

좋은 웹페이지 즐겨찾기