Il programma di installazione
Quindi sto lavorando a un progetto in cui esiste una classe MainViewModel
. Questo MainViewModel
contiene un elenco di Soldiers
attraverso una raccolta osservabile. Ho un pulsante in MainView
che mostra un nuovo AddSoldierView
. AddSoldierView
è vincolante per gli elementi di AddSoldierViewModel
. Il AddSoldierView
è fondamentalmente una forma in cui l'utente inserisce tutti i dati per quel soldato.
Il problema
Ora che ho le informazioni di Soldier
su AddSoldierViewModel
, voglio poterle aggiungere nuovamente a ObservableCollection di MainViewModel
. Ho associato un comando al pulsante (Aggiungi soldato) su AddSoldierView
, ma non sono sicuro di come reindirizzare tali informazioni in MainViewModel
.
Quello che ho provato
Ho già impostato un gestore di eventi su AddSoldierViewModel
in cui SoldierModel
è passato come EventArg. Ma non riesco a far scattare l'evento stesso.
Qualche suggerimento? Ho cercato di rimanere fedele allo spirito MVVM, ma ci sono ancora alcuni nodi che sto cercando di risolvere. Fammi sapere se vuoi vedere alcuni frammenti di codice, diagrammi UML o altro.
AddSoldierViewModel.cs
public class AddSoldierViewModel : ViewModelBase
{
public event EventHandler<AddSoldierEventArgs> AddSoldierClicked;
public ICommand AddSoldierCommand;
private Soldier _soldier;
public Soldier Soldier
{
get => _soldier;
set
{
_soldier = value;
RaisePropertyChanged(nameof(Soldier));
}
}
public AddSoldierViewModel()
{
AddSoldierCommand = new RelayCommand(AddSoldier);
}
private void AddSoldier()
{
OnAddSoldierClicked(new AddSoldierEventArgs()
{
Soldier = Soldier
});
}
protected virtual void OnAddSoldierClicked(AddSoldierEventArgs e)
{
var handler = AddSoldierClicked;
handler?.Invoke(this, e);
}
}
MainViewModel.cs
public class MainViewModel : ViewModelBase
{
#region - Private Properties -
private Team _selectedTeam;
private Soldier _selectedSoldier;
#endregion // - Private Properties -
#region // - Public Properties -
public ObservableCollection<Soldier> Soldiers { get; set; }
public ObservableCollection<Team> Teams { get; }
public Team SelectedTeam
{
get => _selectedTeam;
set
{
_selectedTeam = value;
RaisePropertyChanged(nameof(SelectedTeam));
}
}
public Soldier SelectedSoldier
{
get => _selectedSoldier;
set
{
_selectedSoldier = value;
RaisePropertyChanged(nameof(SelectedSoldier));
}
}
#endregion // - Public Properties -
#region // - Commands -
public ICommand DeleteTeamCommand { get; private set; }
public ICommand AddSoldierDialogCommand { get; private set; }
#endregion // - Commands -
#region - Services -
public IDialogService AddSoldierDialogService { get; private set; }
#endregion // - Services -
#region - Constructors -
public MainViewModel()
{
Soldiers = new ObservableCollection<Soldier>();
Teams = new ObservableCollection<Team>();
Soldiers.CollectionChanged += Soldiers_CollectionChanged;
Teams.CollectionChanged += Teams_CollectionChanged;
DeleteTeamCommand = new RelayCommand(DeleteTeam);
AddSoldierDialogCommand = new RelayCommand(AddSoldierDialog);
AddSoldierDialogService = new AddSoldierDialogService();
}
#endregion // - Constructors -
#region - Methods -
private void AddSoldierDialog()
{
AddSoldierViewModel addSoldierViewModel = new AddSoldierViewModel();
addSoldierViewModel.AddSoldierClicked += AddSoldierViewModel_AddSoldierClicked;
AddSoldierDialogService.ShowDialog(addSoldierViewModel);
}
private void AddSoldierViewModel_AddSoldierClicked(object sender, AddSoldierEventArgs e)
{
Soldiers.Add(new Soldier(e.Soldier));
}
private void Teams_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
foreach (var item in e.NewItems)
{
}
foreach (var item in e.OldItems)
{
}
RaisePropertyChanged(nameof(Teams));
}
private void Soldiers_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
foreach (var item in e.NewItems)
{
}
foreach (var item in e.OldItems)
{
}
RaisePropertyChanged(nameof(Soldiers));
}
#endregion // - Methods -
}