Frage

Gibt es irgendwelche Datenbindung Rahmen (BCL oder auf andere Weise), die zwischen zwei beliebigen CLR Eigenschaften erlauben Bindung , dass INotifyPropertyChanged und INotifyCollectionChanged implementieren? Es scheint zu sein, sollte es möglich sein, so etwas zu tun:

var binding = new Binding();
binding.Source = someSourceObject;
binding.SourcePath = "Customer.Name";
binding.Target = someTargetObject;
binding.TargetPath = "Client.Name";
BindingManager.Bind(binding);

Wo someSourceObject und someTargetObject sind nur POCOs die INotifyPropertyChanged implementieren. Ich bin aber keine Kenntnis von einem BCL Unterstützung für diese, und ich bin nicht sicher, ob es bestehende Frameworks, die dies ermöglichen.

UPDATE : Da es keine bestehende Bibliothek verfügbar ist, habe ich es auf mich genommen, um meinen eigenen zu schreiben. Es ist verfügbar rel="noreferrer">.

Danke

Andere Tipps

Ich bin nicht bekannt, dass Bibliothek , das dies tut -. Aber man konnte schreiben Sie Ihre eigene ziemlich leicht

Hier ist eine Basis 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

  • , dass source und target Überprüfung zugewiesen
  • Überprüfen, ob die identifizierten Eigenschaften von sourcePropertyName und targetPropertyName existieren
  • Überprüfen auf Typ Kompatibilität zwischen den beiden Eigenschaften

Auch Reflexion relativ langsam ist (obwohl es Benchmark, bevor es zu verwerfen, es ist nicht , die langsam), so dass Sie stattdessen kompilierte Ausdrücke verwenden möchten.

Schließlich, da die Eigenschaften von String angibt fehleranfällig ist, könnten Sie stattdessen Linq Ausdrücke und Erweiterungsmethoden verwenden. Dann anstelle des Schreibens

Binder.Bind( source, "Name", target, "Name")

Sie können schreiben

source.Bind( Name => target.Name);

AutoMapper kann Werte zwischen zwei Instanzen kopieren, aber Sie haben Ihren eigenen Code zu schreiben, dies zu machen geschehen automatisch.

Vielleicht Bindable LINQ oder kontinuierliche Linq hier helfen kann. Wenn Sie versuchen, Modell-Eigenschaften hinzuzufügen, die tatsächlich „abgeleiteten Eigenschaften“ Ihrer tatsächlichen, Aktualisieren von Daten sind, um es einfacher für Sie, sollten diese beiden Frameworks zu binden UI helfen.

Ich schrieb einen kleinen Bind Projekt mit voller Unterstützung für die Bindung zwischen neasted Eigenschaften ASync Bindung Aktionen. Die sintax kann nicht einfacher sein:

//Two way binding between neasted properties:
Bind.TwoWay(()=> client.Area.Data.Name == this.AreaName);

//On change action execute:
Bind
    .OnChange(()=> client.Personal.Name)
    .Do(x => clientName = x);

Wenn Sie definiert Ihre Eigenschaften wie DependencyProperty ‚s Sie könnte es tun. Sowohl WF und WPF haben eine Implementierung davon (erste Verbindung ist für WPF. Für WF ist diese eins), so dass Sie müssen entscheiden, welche zu verwenden -. aber beide sollten für Ihre Bedürfnisse ausreichen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top