IsDirty-Flag-Muster
Ich habe eine Basis-Klasse für eine BLL, enthält die folgende Funktion:
public bool IsDirty { get; protected set; }
internal void SetField<TParam>(ref TParam field, TParam value)
{
if (EqualityComparer<TParam>.Default.Equals(field, value) == false)
{
field = value;
IsDirty = true;
}
}
In die Klassen Erben von der Basisklasse verwende ich diesen als wrapper um das Objekt, wie zum Beispiel:
public string UserName
{
get { return _userName; }
set { SetField(ref _userName, value); }
}
Ich die IsDirty-Eigenschaft, um zu testen, um zu sehen, wenn ich auf eine Update. Wenn mindestens einer der Eigenschaften, die änderungen dann speichern Datenbank. Dies funktioniert für die meisten Arten jedoch Sammlungen und Listen ändern können, ohne die mithilfe von set. Ich schrieb einen wrapper für die Collection ein IsDirty-flag auf der Liste, die geprüft werden könnte für den Wandel:
public class CollectionChangeTracked<T> : Collection<T>
{
public bool IsDirty {get; set;}
public CollectionChangeTracked()
{
IsDirty = false;
}
protected override void InsertItem(int index, T newItem)
{
base.InsertItem(index, newItem);
IsDirty = true;
}
protected override void SetItem(int index, T newItem)
{
base.SetItem(index, newItem);
IsDirty = true;
}
protected override void RemoveItem(int index)
{
base.RemoveItem(index);
IsDirty = true;
}
protected override void ClearItems()
{
base.ClearItems();
IsDirty = true;
}
}
}
Das problem ist, dass ich jetzt habe zum test sowohl die Classe die IsDirty-Eigenschaft und jede CollectionChangeTracked.IsDirty-flags für updates. Ich könnte create-Methode, die den test durchführt, in einem Ort wie:
public CollectionChangeTracked<ApplicationRole> RolesList
{
get { return _rolesList; }
set { SetField(ref _rolesList, value); }
}
public override bool IsDirty
{
get { return ResolveIsDirty(); }
protected set { _isDirty = value; }
private bool ResolveIsDirty()
{
bool returnValue;
if (_isDirty || RolesList.IsDirty)
returnValue = true;
else
returnValue = false;
return returnValue;
}
Aber es scheint, wie ich sollte in der Lage zu kommen mit eine saubere Lösung würde es ermöglichen, dass eine Klasse, die enthält die Sammlung abonnieren, um eine änderung der IsDirty der CollectionChangeTracked Objekt und aktualisieren Sie die IsDirty-basierend auf dieser änderung zu. Ist das der bessere Ansatz ist, und wie würde ich das umsetzen?
- Ich fühle mich SO schmutzig.
- Lassen Sie mich fix das für dich: jgauffin = !jgauffin.
Du musst angemeldet sein, um einen Kommentar abzugeben.
können Sie eine
ObservableCollection<T>
registrieren, um denCollectionChanged
Ereignis und markieren Sie die IsDirty-flag, wenn das Ereignis ausgelöst wird.ObservableCollection
alsItemsSource
des GridView-Steuerelements aktualisiert wird, wenn Elemente Hinzugefügt oder aus der Sammlung entfernt. Allerdings, wenn die Elemente in derObservableCollection
sind keineDependencyObjects
und nicht umsetzenINotifyPropertyChnaged
die Elemente in der grid-Ansicht wird nicht aktualisiert, wenn eine Eigenschaft für ein Element in der Sammlung änderungen. Das bedeutet, dass Elemente Hinzugefügt oder entfernt werden können, kann aber nicht aktualisiert werden, ohne zu ersetzen ein vorhandenes ElementINotifyCollectionChanged
- Schnittstelle und registrieren Sie sich für das Ereignis. Ich denke aber, dass es besser ist für die erbende Klasse fügt hinzu, dass die Eigenschaft auch mit der Sammlung geänderten Termin für diese Eigenschaft.