2 Stimmen

POCO an UserControl binden

Hallo ich bin in den Prozess der Erstellung meiner ersten .net gui. Ich frage mich, ob es eine bestimmte Art und Weise gibt, die ich auf meine Poco-Objekte anwenden muss, damit sie an ein Benutzerkontrollfeld gebunden werden können. Ich habe ein paar Objekte, aber ich scheine nicht in der Lage zu sein, sie zu meinem usercontrol zu binden.

Ich habe irgendwo gelesen, dass sie IBindable implementieren müssen, aber ich werde das Gefühl nicht los, dass jemand bereits all den doppelten Code eliminiert hat, den ich in alle meine Klassen eingeben müsste. Gibt es eine Möglichkeit, diese einfach zu binden, oder müsste ich Datasets oder ähnliches verwenden, um diese Bindung einfach zum Laufen zu bringen. Ich habe eine extreme Abneigung gegen Datasets, also bitte ich darum, mir eine andere Möglichkeit zu zeigen ;-)

Ich versuche, an die Benutzerkontrollen aus dem Devexpress-Toolkit zu binden.

1voto

Marc Gravell Punkte 970173

Welche Architektur?

Für die 1-Wege-Bindung benötigen Sie nichts anderes als öffentliche Eigenschaften - und vielleicht einige TypeConverter Implementierungen für beliebige benutzerdefinierte Datentypen ( struct s usw.)

Für eine vollständige 2-Wege-Bindung benötigen Sie eine Eventing-Implementierung - eine von:

  • ein "public event EventHandler FooChanged" für jede Eigenschaft "Foo"
  • eine Implementierung von "INotifyPropertyChanged
  • ein maßgeschneidertes Komponentenmodell (lassen Sie es lieber bleiben - das ist zu viel des Guten)

Ein Beispiel für eine INotifyPropertyChanged Implementierung (beachten Sie, dass Sie möglicherweise einen Teil des Codes zur Wiederverwendung verschieben möchten) :

public class Foo : INotifyPropertyChanged
{
    private string bar;
    public string Bar
    {
        get { return bar; }
        set { UpdateField(ref bar, value, "Bar"); }
    }
    // other properties...

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null) PropertyChanged(this,
            new PropertyChangedEventArgs(propertyName));
    }
    protected bool UpdateField<T>(ref T field, T value,
        string propertyName)
    {
        if (!EqualityComparer<T>.Default.Equals(field, value))
        {
            field = value;
            OnPropertyChanged(propertyName);
            return true;
        }
        return false;
    }
}

Zum Binden setzt von Daten (Grids usw.) ist es am einfachsten, Generika zu verwenden; im Grunde ist die minumum es IList - aber Sie erhalten zusätzliche Metadaten aus einer public T this[int index] Indexer - der List<T> , Collection<T> usw. haben alle. Mehr - BindingList<T> implementiert IBindingList Ermöglichung von sammlungsbasierten Benachrichtigungsereignissen (aber nur für INotifyPropertyChanged - nicht an die FooChanged Muster).

0voto

David Schmitt Punkte 56455

Mit WPF benötigen Sie INotifyPropertyChanged o Eigenschaften von Abhängigkeiten . Prüfen Sie auch INotifyCollectionChanged für Sammlungen.

0voto

Aleris Punkte 7801

El BindingList kann für die Bindung an Listen von generischen Objekten verwendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X