2017-09-17 17 views
-2

私はMVVMの初心者ですが、私は' ID 'と' PositionName 'のいくつかのプロパティを含むModel.csを持っています。 'Items.PositionName == null'でNullReferenceエラーが発生したことをクリックした後、SelectedItems = {Binding Items}とItemSource = {Binding Position}を持つDataGridとCommand = {Binding SHowEdits}のボタンが含まれています。
ここに私のコードです。c# - 'タイプ' System.NullReferenceException 'の未処理の例外

ViewModel.cs

class PositionVM : INotifyPropertyChanged 
{ 
    private ObservableCollection<PositionModel> _position; 
    private PositionModel _items; 
    private ICommand _showedits; 
    public ObservableCollection<PositionModel> Position 
    { 
     get 
     { 
      return _position; 
     } 
     set 
     { 
      _position = value; 
      NotifyProperty("Position"); 
     } 
    } 
    public PositionModel Items 
    { 
     get 
     { 
      return _items; 
     } 
     set 
     { 
      _items = value; 
      NotifyProperty("Items"); 
     } 
    } 
    public ICommand ShowEdits 
    { 
     get 
     { 
      if (_showedits == null) 
       _showedits = new ShowEdit(); 
      return _showedits; 
     } 
     set 
     { 
      _showedits = value; 
     } 
    } 
    public PositionVM() 
    { 
     Position = new ObservableCollection<PositionModel>(); 
     Position.Add(new PositionModel() 
     { 
      ID = 1, 
      PositionName = "asd" 
     }); 
    } 
    public void ShowEditDialog() 
    { 
     if (Items.PositionName == null) 
     { 
      MessageBox.Show("ERROR"); 
     } 
     else 
     { 
      PositionView view = new PositionView(); 
      Data.ID = view.txtid.Text; 
      var z = new PositionView(); 
      z.ShowDialog(); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyProperty(String info) 
    { 
     if(PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

は、なぜ私はこのエラーを取得していますか?どのように私はそれを避けることができますか?このライン

Items.PositionName == null 

がnull参照の例外がスローされますので

答えて

0

私はあなたの問題をICommandと思います。プロパティとして試してみてください:

public ICommand ShowEditsCommand { get; set; }; 

もちろん、作成する必要があります。私はそれが非常に簡単です、あなたが初めてで、あまりにもそれを使用することができ、それのための私のCommandクラスを使用します。

あなたのviewmodelコンストラクタでそれを初期化し、それをメソッドにバインドする必要があり、この後
/// <summary> 
/// Relay implementation of ICommand. 
/// </summary> 
public class RelayCommand : ICommand 
{ 
    private Action execute; 

    private Predicate<object> canExecute; 

    private event EventHandler CanExecuteChangedInternal; 

    public RelayCommand(Action execute) 
     : this(execute, DefaultCanExecute) 
    { 
    } 

    public RelayCommand(Action execute, Predicate<object> canExecute) 
    { 
     if (execute == null) 
     { 
      throw new ArgumentNullException("execute"); 
     } 

     if (canExecute == null) 
     { 
      throw new ArgumentNullException("canExecute"); 
     } 

     this.execute = execute; 
     this.canExecute = canExecute; 
    } 

    public event EventHandler CanExecuteChanged 
    { 
     add 
     { 
      CommandManager.RequerySuggested += value; 
      this.CanExecuteChangedInternal += value; 
     } 

     remove 
     { 
      CommandManager.RequerySuggested -= value; 
      this.CanExecuteChangedInternal -= value; 
     } 
    } 

    public bool CanExecute(object parameter) 
    { 
     return this.canExecute != null && this.canExecute(parameter); 
    } 

    public void Execute(object parameter) 
    { 
     this.execute(); 
    } 

    public void OnCanExecuteChanged() 
    { 
     EventHandler handler = this.CanExecuteChangedInternal; 
     if (handler != null) 
     { 
      handler.Invoke(this, EventArgs.Empty); 
     } 
    } 

    public void Destroy() 
    { 
     this.canExecute = _ => false; 
     this.execute =() => { return; }; 
    } 

    private static bool DefaultCanExecute(object parameter) 
    { 
     return true; 
    } 
} 

ShowEditsCommand = new RelayCommand(ShowEdits); 

ShowEditsは、コマンド呼び出し時に実行する必要のあるメソッドです。

public void ShowEdits() 
{ 
// do something here 
} 
0

Thanksss、それはItemsがnullであることは明らかです。

なぜItemsがnullですか?

Itemsプロパティは以下のように定義されます。

public PositionModel Items 
{ 
    get 
    { 
     return _items; 
    } 
    set 
    { 
     _items = value; 
     NotifyProperty("Items"); 
    } 
} 

あなたはゲッター(get { return _items; })への呼び出しが行われPositionModelの値を設定しようとすると、順番にオブジェクトへの参照を取得_itemsこと指し示す。取得する値はnullです。これは、セッターが呼び出されていないことを意味します。つまり、_itemsを値で初期化するか、または初期化した後で、コードの別の部分でnullに設定します。

あなたのコードを見ると、私たちはあなたのクラスのコンストラクタを参照してください。

public PositionVM() 
{ 
    Position = new ObservableCollection<PositionModel>(); 
    Position.Add(new PositionModel() 
    { 
     ID = 1, 
     PositionName = "asd" 
    }); 
} 

どうやら、Itemsがそこに初期化されません。だからItemsは参照型のデフォルト値を持っています...