2016-08-01 5 views
0

(Telerik) GridView에 바인딩 된 목록이 있습니다. 선택한 항목은 사용자가 행을 클릭 할 때 GridView에서 선택한 행의 객체에 지정된 유형 T의 개별 변수입니다. T는 ObservableObject에서 파생되었습니다. 즉, MVVM Light Toolkit을 사용하고 있음을 의미합니다.관찰 가능 개체를 NULL로 설정 == CRASH

특정 상황에서 내 ViewModel에서 행의 선택을 취소해야합니다. 선택한 항목이 ViewModel에서 NULL로 설정된 경우 GridView 컨트롤에서이 기능이 작동합니다. 이 작업을 수행 할 때마다 MVVM에서 충돌 (NPE)이 발생합니다. 디버깅하여 ObservableObject.cs에서 오류가 발생했음을 확인했습니다. 이 방법

protected bool Set<T>(
     Expression<Func<T>> propertyExpression, 
     ref T field, 
     T newValue) 

호출하고 설계 여부로이 작동하는지 모르겠어요 RaisePropertyChanged(propertyExpression)

를 호출 할 때 반환하기 전에 한 줄을 충돌합니다. 내 문제는보기에서 내 GridView의 행 선택을 취소하려면 ViewModel에서 선택한 개체를 NULL로 설정해야한다는 것입니다. 선택 취소에 CodeBehind를 사용할 수 없습니다.!

코드는 내가 가진 : 당신은 그리드의 행을 클릭하면

public ObservableCollection<ContractTypeDto> ContractTypes { get; private set; } 

    public ContractTypeDto SelectedContractType 
    { 
     get { return _selectedContractType; } 
     set 
     { 
      Set(() => SelectedContractType, ref _selectedContractType, value); 
      RaisePropertyChanged(() => SelectedContractType); 
     } 
    } 

는이 레코드의 세부 정보를 많이 포함 된 새 UserControl을을 엽니 다. 이 컨트롤에는 자체 ViewModel이 있습니다. 호출 된 뷰 모델 (선택한 항목이 저장된 위치)을 저장합니다. 페이지 (컨트롤) 닫힐 때 (파괴) 그리드 행을 선택을 취소해야합니다. 나는 이렇게 메서드를 호출 :

protected void DeselectCallersSelectedItem() 
    { 
     if (CallingObject == typeof(ContractTypeListViewModel)) 
     { 
      var vm = SimpleIoc.Default.GetInstance<ContractTypeListViewModel>(); 
      vm.SelectedContractType = null; 
     } 
    } 

어떤 아이디어?

답변

0

컬렉션을 제거하려면 SelectedItem 속성을 null로 설정하거나 SelectedItems을 지울 수 있습니다.

gridViewName.SelectedItem = null; 
gridViewName.SelectedItems.Clear(); 

코드를 표시하지 않으면 우리는 정확하게 당신을 도울 수 없습니다. 내가 할 수 있다고 생각하는 해결책은 뷰 모델에 INotifyPropertyChanged 인터페이스를 구현하고 선택한 항목을 해당 유형의 속성에 바인딩하는 것입니다. 또한 바인딩 실패가 있으면 출력 창을 확인하십시오.

+0

본인의 원본 메시지를 추가 정보로 업데이트했습니다. MVVM Light 툴킷을 사용합니다. ObservableObject는이 툴킷의 클래스이며 INotifyPropertyChanged를 구현합니다. 내 항목을 'null'로 설정하면 MVVM 라이트가 손상됩니다. – ThommyB