Ich bin keine bekannt Bibliothek, die dies tut - aber Sie könnten Ihre eigenen ziemlich einfach schreiben.
Hier ist eine Grundlage ich in wenigen Minuten oben geklopft, die Zwei-Wege-Datenbindung zwischen zwei einfachen Eigenschaften festgelegt:
public static class Binder
{
public static void Bind(
INotifyPropertyChanged source,
string sourcePropertyName,
INotifyPropertyChanged target,
string targetPropertyName)
{
var sourceProperty
= source.GetType().GetProperty(sourcePropertyName);
var targetProperty
= target.GetType().GetProperty(targetPropertyName);
source.PropertyChanged +=
(s, a) =>
{
var sourceValue = sourceProperty.GetValue(source, null);
var targetValue = targetProperty.GetValue(target, null);
if (!Object.Equals(sourceValue, targetValue))
{
targetProperty.SetValue(target, sourceValue, null);
}
};
target.PropertyChanged +=
(s, a) =>
{
var sourceValue = sourceProperty.GetValue(source, null);
var targetValue = targetProperty.GetValue(target, null);
if (!Object.Equals(sourceValue, targetValue))
{
sourceProperty.SetValue(source, targetValue, null);
}
};
}
}
Natürlich fehlt dieser Code ein paar Nettigkeiten. Dinge hinzufügen schließen
- Überprüfen, ob
source
und target
- Überprüfen, dass die Eigenschaften identifiziert durch
sourcePropertyName
und targetPropertyName
existieren
- Überprüfung auf Typ Kompatibilität zwischen den beiden Eigenschaften
Auch zugeordnet sind, Spiegelung ist relativ langsam (obwohl Benchmark es vor dem Verwerfen, es ist nicht , dass langsam), so dass Sie möglicherweise kompiliert verwenden möchten Ausdrücke stattdessen.
Schließlich, da die Angabe von Eigenschaften per Zeichenfolge fehleranfällig ist, könnten Sie stattdessen Linq-Ausdrücke und Erweiterungsmethoden verwenden. Dann statt
Binder.Bind(source, "Name", target, "Name")
schreiben könnten Sie
source.Bind(Name => target.Name);
Ich fragte tatsächlich, weil ich erwog, mein eigenes zu schreiben. Ich wollte das Rad nicht neu erfinden und alles ... danke. –
Update: Ich habe in der Frage zu meiner Bibliothek verknüpft. –
Ich brauchte eine einfache Barebone-Databinding-Klasse für mein aktuelles Projekt-in-Eile, und die obige passt fast zu dem, was ich brauche. Ich habe gerade die Eigenschaftsnamen, die mit Reflection verwendet werden, durch zwei Action-Delegaten ersetzt, in denen ich von der POCO-Funktion get/set und Transformationen und Formatierungen anwende. Ich werde Truss in einem nächsten Projekt definitiv einen guten Versuch geben, weil es für mich wirklich interresant klingt. – Larry