2011-11-22 12 views
15

에 유형 'MS.Internal.NamedObject'의 개체를 캐스팅 할 수 없습니다 나는 WPF에 새로운 아니지만, 나는이 문제를 알아낼 수 없습니다 : 나는 ComboBox ES에 결합한다는 ObservableCollection<MyCustomType>를 사용는 사용자 정의 유형

을 , 그것은 모든 정상적으로 잘 작동하지만 어떤 시점에서 나는 컬렉션의 내용을 변경해야합니다 (나는 데이터베이스에서 새 집합을 검색합니다.이 집합은 이전 집합의 일부를 포함 할 수도 있고 포함하지 않을 수도 있습니다).

요소를 추가하거나 제거하는 작업은 모두 WPF에서 수행되지만, 전체 컬렉션을 변경하면 컬렉션의 PropertyChanged를 올려야한다는 것을 알았습니다.

문제는 가끔으로 나에게 친숙하지 않은 예외가 발생합니다.
충돌을 정확히 일으키는 지 확신 할 수 없지만보기를 터치하지 않고 DB에서 새 세트를 검색하지 않으면 충돌이 발생하지 않습니다. 나는 예외를 얻을

public const string MyObsCollectionProperty = "MyObsCollection"; 
    private ObservableCollection<MyCustomType> m_MyObsCollection; 
    public ObservableCollection<MyCustomType> MyObsCollection 
    { 
     get { return m_MyObsCollection; } 
     set 
     { 
      m_MyObsCollection = value; 
      RaisePropertyChanged(MyObsCollectionProperty); // <-- Crashes here 
     } 
    } 

: 여기


몇 가지 코드 Unable to cast object of type 'MS.Internal.NamedObject' to type 'MyNameSpace.MyCustomType'

이 예외는 프리즘에서 오는 있습니다를,하지만 난 내 뷰 모델에 NotificationObject에서 상속해서 아마. 나는이 문제에 어떤 도움을 주셔서 감사합니다

,

감사합니다,

LK.

편집 : 문제는 ComboBox에서 발생한다고 생각합니다. 더 구체적으로는 속성을 설정하는 방식입니다.

ObservableCollection에 ItemsSource 속성을 바인딩하고 어떤 요소를 선택할지 결정하기 위해 SelectedValue를 ObservableCollection의 항목 필드에 바인딩합니다 (ComboBox는 ListView 내에 중첩 됨).
또한 SelectedValuePath를 설정합니다 (아이디어를 얻음).

내가 처음 콜렉션 지옥을 바꿨을 때 그 설치가 중단됩니다. 가상화로 인해 뷰를 건드리지 않으면 안심할 수 있습니다 (처음에는 숨겨 짐).

는 ADDITION :

의 InnerException는 nulll입니다.

메시지 :

나는 다음과 같이 declarated 하나의 콤보 상자에 문제를 격리 : 더 많은 편집이

at Microsoft.Practices.Prism.Commands.DelegateCommand`1.<>c__DisplayClass6.<.ctor>b__3(Object o) at Microsoft.Practices.Prism.Commands.DelegateCommandBase.CanExecute(Object parameter) at Microsoft.Practices.Prism.Commands.DelegateCommandBase.System.Windows.Input.ICommand.CanExecute(Object parameter) at System.Windows.Interactivity.InvokeCommandAction.Invoke(Object parameter) at System.Windows.Interactivity.TriggerBase.InvokeActions(Object parameter) at System.Windows.Interactivity.EventTriggerBase.OnEvent(EventArgs eventArgs) at System.Windows.Interactivity.EventTriggerBase.OnEventImpl(Object sender, EventArgs eventArgs) at System.Windows.Controls.SelectionChangedEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e) at System.Windows.Controls.ComboBox.OnSelectionChanged(SelectionChangedEventArgs e) at System.Windows.Controls.Primitives.Selector.InvokeSelectionChanged(List`1 unselectedItems, List`1 selectedItems) at System.Windows.Controls.Primitives.Selector.SelectionChanger.End() at System.Windows.Controls.Primitives.Selector.OnItemsChanged(NotifyCollectionChangedEventArgs e) at System.Windows.Controls.ItemsControl.OnItemCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e) at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e) at System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args) at System.Windows.Controls.ItemCollection.System.Windows.IWeakEventListener.ReceiveWeakEvent(Type managerType, Object sender, EventArgs e) at System.Windows.WeakEventManager.DeliverEventToList(Object sender, EventArgs args, ListenerList list) at System.Windows.WeakEventManager.DeliverEvent(Object sender, EventArgs args) at System.Collections.Specialized.CollectionChangedEventManager.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args) at System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args) at System.Windows.Data.ListCollectionView.RefreshOverride() at System.Windows.Data.CollectionView.RefreshOrDefer() at System.Windows.Data.ListCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args) at System.Windows.Data.CollectionView.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args) at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e) at System.Collections.ObjectModel.ObservableCollection`1.ClearItems() at System.Collections.ObjectModel.Collection`1.Clear() at CocoonV4.Modules.CocoonViewsVMs.ManageTemplateDekocastViewModel.SetAllowedDekos(IEnumerable`1 _NewAllowedDekos) in C:\Users\lkottmann\Documents\Visual Studio 2010\Projects\IAV-Cocoon\MAIN\CocoonV4\CocoonV4.Modules.RunningItem\CocoonViewsVMs\ManageTemplateDekocastViewModel.cs:line 83 at CocoonV4.Modules.CocoonViewsVMs.ManageTemplateDekocastViewModel.LoadTemplates(Nullable`1 param) in C:\Users\lkottmann\Documents\Visual Studio 2010\Projects\IAV-Cocoon\MAIN\CocoonV4\CocoonV4.Modules.RunningItem\CocoonViewsVMs\ManageTemplateDekocastViewModel.cs:line 128 at Microsoft.Practices.Prism.Commands.DelegateCommand`1.<>c__DisplayClass6.<.ctor>b__2(Object o) at Microsoft.Practices.Prism.Commands.DelegateCommandBase.Execute(Object parameter) at Microsoft.Practices.Prism.Commands.DelegateCommandBase.System.Windows.Input.ICommand.Execute(Object parameter) at System.Windows.Interactivity.InvokeCommandAction.Invoke(Object parameter) at System.Windows.Interactivity.TriggerBase.InvokeActions(Object parameter) at System.Windows.Interactivity.EventTriggerBase.OnEvent(EventArgs eventArgs) at System.Windows.Interactivity.EventTriggerBase.OnEventImpl(Object sender, EventArgs eventArgs) at System.Windows.Controls.SelectionChangedEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e) at System.Windows.Controls.ComboBox.OnSelectionChanged(SelectionChangedEventArgs e) at System.Windows.Controls.Primitives.Selector.InvokeSelectionChanged(List`1 unselectedItems, List`1 selectedItems) at System.Windows.Controls.Primitives.Selector.SelectionChanger.End() at System.Windows.Controls.Primitives.Selector.SelectionChanger.SelectJustThisItem(Object item, Boolean assumeInItemsCollection) at System.Windows.Controls.ComboBox.NotifyComboBoxItemMouseUp(ComboBoxItem comboBoxItem) at System.Windows.Controls.ComboBoxItem.OnMouseLeftButtonUp(MouseButtonEventArgs e) at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e) at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e) at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args) at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) at System.Windows.Input.InputManager.ProcessStagingArea() at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input) at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel) at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) at System.Windows.Application.RunDispatcher(Object ignore) at System.Windows.Application.RunInternal(Window window) at System.Windows.Application.Run(Window window) at System.Windows.Application.Run() at CocoonV4.App.Main() in C:\Users\lkottmann\Documents\Visual Studio 2010\Projects\IAV-Cocoon\MAIN\CocoonV4\CocoonV4\obj\x86\Debug\App.g.cs:line 0 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() 

Unable to cast object of type 'MS.Internal.NamedObject' to type 'CocoonV4.DAL.WcfServiceCocoonV4.DekoTemplate'.

<custom:CComboBox x:Name="cmbFirstDko" 
        ItemsSource="{Binding Path=DataContext.MyFirstCollection, ElementName=myViewName}" 
        SelectedValue="{Binding anObjectID, Mode=TwoWay}" 
        SelectedValuePath="anObjectID"> 

주의하시기 바랍니다 anObjectID 특성 SelectedValueListView의 DataContext (이 ComboBox는 해당 ListView 항목의 일부를 표시 함)에서 오는 반면 은 SelectedValuePath에 있으며 DataContext.MyFirstCollection의 각 항목에있는 속성을 나타냅니다.

이렇게하면 ListView의 각 요소에 대해 다른 ComboBoxItem을 선택할 수 있습니다.

제 설명이 명확하고, 그렇지 않은 경우 의견을 말하면 명확히하기를 바랍니다.

혁신 : 선택 상자가 자신의 DataContext, 이것은 나의 예에서와 같이,이 컬렉션 사이의 바인딩을있을 때 개입 소위 SentinelObjects의 작업의 결과이다 {DisconnectedItem}로 설정해야합니다.

그것은 공식적으로 실제로 프레임 워크의 버그이며, 다음 버전,이 MS Bug Page

사람이 해결 방법을 알고 있나요 참조 수정되었습니다?

편집 : 내 블로그에 링크 답변이있을 사용하지만, 나는 그것을 이동하는 동안 사람들은 대답을 downvoted. 나는 그것을 아프므로 이제 준비가되면 다시 돌아올 것입니다.

+0

'ObservableCollection' 속성에 setter를 사용하지 않는 것이 좋습니다. 일반적으로'readonly' 필드와 getter 만있는 속성을 사용합니다. –

+0

이 RaisePropertyChanged가 구현 된 방법을 게시 할 수 있습니까?왜 끈을 가져 가지 않는거야? – MBen

+0

@MBen : MyObsCollectionProperty는 문자열입니다. –

답변

2
  1. ObservableCollection 내부에서 구현 된 INotifiyProperty가 변경되어 있으므로 RaisePropertyChanged를 호출하여 MyObsCollection을 호출 할 필요가 없습니다.
  2. 설정 호출 중 값을 할당하는 동안 충돌이 발생한다고 생각합니다. 다른 유형의 컬렉션 중 하나의 컬렉션을 할당하려고하면이 문제가 발생합니다. 당신은 MyCustomType의 객체를 생성해야하고 u는을 할당 할 경우 코드의 전체 코드 또는 조각을 게시 할 수 있다면 그것은 좋은 것

을 MyObsCollection 대신 직접 다른 유형의 집합을 할당의 MyObsCollection에 추가해야합니다 또는 개체를 MyObsCollection에 추가하십시오.

2

지금 당장 같은 문제가 발생합니다. 그리고 ItemContainerStyle에서 정적 ressource Style을 제거하고 ListBox 바로 아래에 정의하면 문제가 사라집니다.

DataTemplate의 요소에 x : Name 속성이 있는데 삭제 한 이후 컴파일러에서 전혀 만들지 않았습니다. 그래서 나는 그것이 의미를 갖도록 길을 바꾸었다.

희망이 작은 트릭이 도움이 될 것입니다!

관련 문제