2016-08-01 8 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)

を呼び出すときに、戻りの前に1行をクラッシュします。私の問題は、ビュー内の自分の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); 
     } 
    } 

が、それはこのレコードの詳細の多くを含む新しいユーザーコントロールを開きます。このコントロールには、独自の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

関連する問題