Witam.
Mam problem z którym nie wiem jak mam sobie poradzić.
Mam klasę NowaFakturaViewModel :
Komentarz odnosnie problemu w kodzie
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Magazyn.Model.Entities;
using Magazyn.Model.EntitiesForAllView;
using Magazyn.Helper;
using System.Windows.Input;
using GalaSoft.MvvmLight.Messaging;
using Magazyn.Views;
using System.Collections.ObjectModel;
namespace Magazyn.ViewModels.HandelTabViewModels
{
public class NowaFakturaViewModel : DodajWszystkieViewModel<PozycjeDokumentuForAllView>
{
#region Constructor
public NowaFakturaViewModel()
: base()
{
base.DisplayName = "Nowa Faktura";
dokument = new Dokumenty();
adres = new Adresy();
kontrahent = new Kontrahenci();
modyfikacja = false;
Messenger.Default.Register<DokumentyForAllView>(this, modyfikuj);
Messenger.Default.Register<PozycjeDokumentow>(this, addPozycjeFaktury);
Messenger.Default.Register<KontrahenciForAllView>(this, getWybranyKontrahentNabywca);
this.NumerDokumentu = "FA" + DateTime.Now.Day + DateTime.Now.Month + DateTime.Now.Year + DateTime.Now.Hour + DateTime.Now.Minute;
this.DataWystawienia = DateTime.Now;
}
#endregion // Constructor
#region Fields
private bool modyfikacja;
protected Dokumenty dokument;
protected Adresy adres;
protected Kontrahenci kontrahent;
private BaseCommand _KontrahenciCommand;
private BaseCommand _GrupyCommand;
private BaseCommand _PlatnosciCommand;
private BaseCommand _TypyDokumentowCommand;
private BaseCommand _DeletePozycjeCommand;
private PozycjeDokumentuForAllView _WybranaPozycja;
public PozycjeDokumentuForAllView WybranaPozycja
{
get
{
return _WybranaPozycja;
}
set
{
if (_WybranaPozycja != value)
{
_WybranaPozycja = value;
}
}
}
#endregion //Fiends
#region Properties
// Wyciąłem gdyż jest i dość sporo a nie są istotne teraz według mnie
#endregion // Properties
#region ComboBoxItems
// Wyciąłem gdyż jest i dość sporo a nie są istotne teraz według mnie
#endregion //ComboBoxItems
#region Commands
// Wyciąłem gdyż jest i dość sporo a nie są istotne teraz według mnie
#endregion // Commands
#region Helpers
public void DeletePozycje()
{
PozycjeDokumentuForAllView pozycja = _WybranaPozycja;
PozycjeDokumentow poz = (
from dok in magazynEntities.PozycjeDokumentow
where dok.id == WybranaPozycja.Id
select dok
).FirstOrDefault();
poz.idStatusu = 2;
magazynEntities.SaveChanges();
List.Remove(pozycja);
}
public virtual void addPozycjeFaktury(PozycjeDokumentow pozycjaDokumentu)
{
pozycjaDokumentu.idStatusu = 1;
magazynEntities.PozycjeDokumentow.AddObject(pozycjaDokumentu);
dokument.PozycjeDokumentow.Add(pozycjaDokumentu);
List.Add
(
new PozycjeDokumentuForAllView
{
Id = pozycjaDokumentu.id,
TowarKod = pozycjaDokumentu.Towary.kod,
TowarNazwa = pozycjaDokumentu.Towary.nazwa,
Cena = pozycjaDokumentu.cena,
Ilosc = pozycjaDokumentu.ilosc,
Rabat = pozycjaDokumentu.rabat
}
);
}
public override void LoadList()
{
List = new ObservableCollection<PozycjeDokumentuForAllView>
(
from pozDok in dokument.PozycjeDokumentow
where pozDok.idStatusu == 1
select new PozycjeDokumentuForAllView
{
Id = pozDok.id,
TowarKod = pozDok.Towary.kod,
TowarNazwa = pozDok.Towary.nazwa,
Cena = pozDok.cena,
Ilosc = pozDok.ilosc,
Rabat = pozDok.rabat
}
);
OnPropertyChanged(() => List);
}
public override void Save()
{
if (!this.modyfikacja)
{
dokument.idStatusu = 1;
dokument.idTypuDokumentu = 1;
magazynEntities.AddToDokumenty(dokument);
/* PROBLEM!
Wysyłam obiekt dokument który zawiera wszystkie powiązania do okna głównego który na tą wiadomość reaguje następująco otwiera nowe okno które jest Wydaniem Zewnętrznym i okno uzupełnia sie atomatycznie danymi z Faktury
wraz z polami czyli towarami jakie sa na fakturze ale po kliknieciu zapisz WZ lub probie dodanai jeszcze jednego towaru do WZ poza tymi z faktury program się wysypuje.
*/
Messenger.Default.Send<Dokumenty>(dokument);
}
magazynEntities.SaveChanges();
}
...
}
}
Klasa Wydania Zewnetrznego dziedziczy po NowaFakturaViewModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Magazyn.Model.Entities;
using Magazyn.Model.EntitiesForAllView;
namespace Magazyn.ViewModels.HandelTabViewModels
{
class NoweWydanieZewnetrzneViewModel : NowaFakturaViewModel
{
#region Constructor
public NoweWydanieZewnetrzneViewModel()
: base()
{
base.DisplayName = "Nowa WZ";
}
public NoweWydanieZewnetrzneViewModel(Dokumenty a)
: base()
{
base.DisplayName = "Nowa WZ";
IdTypuDokumentu = 2;
dokument = a;
dokument.idTypuDokumentu = 2;
dokument.dataWystawienia = DateTime.Now;
dokument.numerDokumentu = "123321";
}
#endregion // Constructor
#region Helpers
public override void Save()
{
dokument.idStatusu = 1;
magazynEntities.AddToDokumenty(dokument);
magazynEntities.SaveChanges();
}
public override void addPozycjeFaktury(PozycjeDokumentow pozycjaDokumentu)
{
//dodajemy pozycję do bazy
pozycjaDokumentu.idStatusu = 1;
magazynEntities.PozycjeDokumentow.AddObject(pozycjaDokumentu);
//kojarzymy pozycję faktury z fakturą w której jesteśmy
dokument.PozycjeDokumentow.Add(pozycjaDokumentu);
//dodajemy pozycję do wyświetlanej listy
List.Add
(
new PozycjeDokumentuForAllView
{
Id = pozycjaDokumentu.id,
TowarKod = pozycjaDokumentu.Towary.kod,
TowarNazwa = pozycjaDokumentu.Towary.nazwa,
Cena = pozycjaDokumentu.cena,
Ilosc = pozycjaDokumentu.ilosc,
Rabat = pozycjaDokumentu.rabat
}
);
}
#endregion // Helpers
}
}
Błędy jakie wyrzuca Visual:
Komunikat:
Do obiektu jednostki nie może odwoływać się wiele wystąpień interfejsu IEntityChangeTracker.
Do kodu wygenerowanego przez Visual za pomoca entities:
public void AddToDokumenty(Dokumenty dokumenty)
{
base.AddObject("Dokumenty", dokumenty);
}