2016-08-01 3 views
0

У меня есть список, связанный с (Telerik) GridView. Выбранный элемент представляет собой отдельную переменную типа T, которой назначается объект выбранной строки в GridView, когда пользователь нажимает на строку. T получен из ObservableObject. Это означает, что я использую MVVM Light Toolkit.Установка наблюдаемого объекта на NULL == CRASH

Мне нужно отменить выбор строки из моего ViewModel в определенных ситуациях. В элементе управления GridView это работает, если выбранный элемент установлен в NULL в ViewModel. Всякий раз, когда я это делаю, MVVM сообщает об аварии (NPE). Я отладил его и увидел, что он не работает в ObservableObject.cs. Он вызывает метод

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

и разбивает одну строку перед возвращением при вызове RaisePropertyChanged(propertyExpression)

Я не знаю, если это работает как задумано или нет. Моя проблема в том, что мне нужно установить выбранный объект в NULL в ViewModel, чтобы отменить выбор строки моего GridView в представлении. Я НЕ МОЖЕТ использовать 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. Когда я устанавливаю свой элемент на «пустые» ошибки MVVM. – ThommyB

Смежные вопросы