2016-04-19 6 views
0

ich folgendes erreichen will:aktualisieren CheckBox und Änderung listitem entsprechenden

Funktionalität der IsDeleteBtnShow Eigenschaft im MyViewModel ist ein Löschsymbol angezeigt werden, wenn eine der Checkbox Stück wahr ist. Da jedoch die Eigenschaft der Checkbox im ListViewModel zugänglich ist, muss ich dieses Update von ListViewModel an MyViewModel weitergeben.

Allerdings bekomme ich null Ausnahme in der ListItemViewModel. Aber wenn ich ListItemViewModel Konstruktor parent aufrufen ist nicht null. Ich frage mich, was ich falsch mache?

MyViewModel.cs

public class MyViewModel:MvxViewModel 
{ 

    private ObservableCollection<ListItemViewModel> _myListViews; 

    public ObservableCollection<ListItemViewModel> MyListViews 
    { 
     get { return _myListViews; } 
     set 
     { 
      _myListViews= value; 
      RaisePropertyChanged(() => MyListViews); 
     } 
    } 

    private bool _isDeleteBtnShow = false; 
    public bool IsDeleteBtnShow 
    { 
     get { 
      return _isDeleteBtnShow; 
     } 
     set { 
      _isDeleteBtnShow = value; 
      RaisePropertyChanged(() => IsDeleteBtnShow); 
     } 
    } 

    public void Init(string myId) 
    { 
     List<ListItemViewModel> allListItems = new List<ListItemViewModel>(); 
     allListItems = _myService.GetAllItems(myId); 

     foreach (var myTest in allListItems) 
     { 
      _myListViews.Add(ListItemViewModel.CreateViewModel(myTest)); 
     } 
     ListItemViewModel obj = new ListItemViewModel(this); 

     } 
    } 

ListItemViewModel.cs

public class ListItemViewModel 
{ 
    public int Id { get; set; } 
    public string Text { get; set; } 
    private bool _isChecked; 
    public DateTime Date { get; set; } 

    readonly MyViewModel _parent; 

    public ListItemViewModel() 
    { 
     // parameterless constructor 
    } 

    public ListItemViewModel(MyViewModel parent) 
    { 
     // _parent is not null here 
     _parent = parent; 
    } 

    public static ListItemViewModel CreateViewModel(Test entity) 
    { 
     if (entity == null) 
     { 
      return null; 
     } 
     return new ListItemViewModel 
     { 
      Date = entity.Date, 
      IsSelected = entity.IsSelected, 
     }; 
    } 

    public ICommand CheckBoxSelectionCommand 
    { 
     get 
     { 
      return new MvxCommand(() => 
      { 
       var isChecked = IsSelected; 
       // the following _parent is null 
       _parent.IsDeleteBtnShow = true; 
      }); 
     } 
    } 

    private bool _isSelected; 

    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set 
     { 
      _isSelected = value; 
      RaisePropertyChanged(() => IsSelected); 
     } 
    } 

    public bool IsChecked 
    { 
     get { return _isChecked; } 
     set 
     { 
      _isChecked = value; 
     } 
    } 
} 
+0

_once Benutzer es ändern, möchte ich update_ mag - do Sie meinen, wenn das ViewModel vom Benutzer über das von Ihnen verwendete Framework zurückkommt? Und ruft das den erforderlichen Konstruktor oder den Standardkonstruktor? – stuartd

+0

Die 'IsDeleteBtnShow' -Eigenschaft im' MyViewModel' dient zum Anzeigen oder Ausblenden des Löschsymbols, wenn eines der Kontrollkästchen des Elements entsprechend wahr oder falsch ist. Da die Eigenschaft der Checkbox im 'ListViewModel' zugänglich ist, muss ich dieses Update von' ListViewModel' nach 'MyViewModel' übergeben. – hotspring

Antwort

2

Sie erhalten die Ausnahme, weil Sie parameterlosen Konstruktor von ListItemViewModel verwenden, wenn Sie CreateViewModel der View-Modell erstellen rufen.

Sie müssen MyViewModel Parameter, um es hinzuzufügen und die View-Modell übergeben, wenn ListItemViewModel erstellen:

 List<ListItemViewModel> allListItems = new List<ListItemViewModel>(); 
    allListItems = _myService.GetAllItems(myId); 

    foreach (var myTest in allListItems) 
    { 
      _myListViews.Add(ListItemViewModel.CreateViewModel(this, myTest)); 
    } 

und in ListItemViewModel:

public static ListItemViewModel CreateViewModel(MyViewModel parent, Test entity) 
    { 
     if (entity == null) 
     { 
      return null; 
     } 
     return new ListItemViewModel(parent) 
     { 
      Date = entity.Date, 
      IsSelected = entity.IsSelected, 
     }; 
    } 
+0

'CreateViewModel' nimmt nur ein Argument. – hotspring

+0

@housspring: Ich habe Code aktualisiert, können Sie es überprüfen? – Giorgi

+0

geben Sie mir 5 Minuten bitte, ich bin jetzt neu erstellen und die Bereitstellung der Lösung für das XAP. – hotspring

Verwandte Themen