Entwickler-Ecke
WPF / Silverlight - DataBinding mit DependencyProperty und Interfaces
Määx - Mo 24.03.14 18:00
Titel: DataBinding mit DependencyProperty und Interfaces
Hallo zusammen,
ich habe mir ein custom UserControl gebastelt und hierbei nun ein Problem:
Mein Control enthält eine
BindingList<MyInterface> ComboBoxItemSouce die als DependencyProperty ausgewertet wird und als ItemsSource meiner ComboBox dient. In meinem Mainwindow habe ich dann ein solches UserControl hinzugefügt und die Eigenschaft ComboBoxItemSouce wiederum via Binding an eine List des Typs
BindingList<MyInterfaceImplementation> gebunden.
Nutze ich überall nur die MyInterfacImplementation klappt alles super, starte ich die Anwendung jedoch unter Nutzung des Interfaces, erhalte ich folgenden fehler:
Quelltext
1:
| Cannot create default converter to perform 'one-way' conversions between types 'System.ComponentModel.BindingList1[WpfApplication1.MyInterfaceImplementation]' and 'System.ComponentModel.BindingList1[WpfApplication1.MyInterface]' |
Entsprechend des Fehlers hatte ich zunächst versucht einen IValueConverter zu implementieren und im Mainwindow der ComboBoxItemSouce-Eigenschaft-Binding hinzuzufügen - jedoch ohne erfolg...
Wie macht man soetwas richtig?
Vielen Dank
Määx
Moderiert von
Th69: C#- und Code-Tags hinzugefügt
Ralf Jansen - Mo 24.03.14 18:48
Kann da konkret nicht weiterhelfen. Sorry.
Aber ein Interface für die Properties einer Modelklasse klingt arg nach overengineering.
Palladin007 - Mo 24.03.14 22:59
Ich bin selber in WPF noch nicht fitt genug, dass ich dir da effektiv helfen könnte, allerdings bindet beim Fenster selber auch an ein Interface und das habe ich so gelöst:
XML-Daten
1:
| <TextBox Text="{Binding Path=(ViewModels:IInterface.Property)}" /> |
ViewModels ist dabei der Namespace, wo das Interface liegt.
Ich programmiere dann nur noch gegen das Interface und gebe dem DataContext eine passende Instanz.
Ich glaube, dabei gab es komischer weise keine Intellisense, funktioniert hat es dann aber trotzdem.
Ich weiß nicht, ob dir das hilft, aber vielleicht tut es das ja.
@Ralf:
Wieso Overengineering? Ich hatte dadurch jetzt nicht unbedingt großen Mehraufwand und ich kann auch leicht das ViewModel aus tauschen.
Solange das keinen großen zusätzlichen Aufwand bedeutet, dann denke ich, schadet das nicht, nur an Interfaces zu binden und beim Aufruf der View dann eine Instanz einer Klasse, die das Interface implementiert, zu überlegen.
Oder ich habe hier etwas ganz gehörig falsch verstanden, so lange bin ich noch nicht an WPF dran. ^^
Ralf Jansen - Mo 24.03.14 23:37
Zitat: |
@Ralf:
Wieso Overengineering? Ich hatte dadurch jetzt nicht unbedingt großen Mehraufwand und ich kann auch leicht das ViewModel aus tauschen. |
Was wäre der Sinn an IPerson im Beispiel unten? Warum sollte ich das austauschen wollen? Durch welche sinnvolle andere Implementierung?
Ich will nicht komplett ausschließen das es einen sinnvollen Einsatz von Interfaces in Modelklassen gibt insbesondere wenn sie sich auf einen nicht vom Modell zu trennenden Logikteil bezieht. Aber immer wenn ich Interfaces an Modellen gesehen habe waren sie ein überflüssige Abstraktion.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| public interface IPerson { public string Name { get; set; } public string Nachname { get; set; } }
public class Person : IPerson { public string Name { get; set; } public string Nachname { get; set; } } |
Palladin007 - Di 25.03.14 00:11
Als spontane Idee:
Ein Fenster baut sich aus mehreren komplexeren Controls zusammen, die alle ihren eigenen DataContext fordern.
Entweder ich baue mir Properties, welche die Objekte dort als DataContext einsortieren, wo sie hin sollen, oder ich lasse die Controls gegen ein Interface binden.
Dann kann ich ein ViewModel schreiben, das alle Interfaces implementiert und dann intern nur noch an die konkreten Teil-ViewModels durch leitet.
Wenn da der Ansatz schon falsch ist und ich mangels Erfahrung/Wissen viel bessere Möglichkeiten übersehen habe, dann lasse ich mich gerne korrigieren und lerne daraus. ^^
In diesem konkreten Person-Beispiel ist das dann aber tatsächlich übertrieben.
PS: Der Inhalt eines Interfaces kann keine Zugriffsmodifizieren haben *klugscheiß* Sorry ^^
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!