JanR hat folgendes geschrieben : |
Wenn ich dann für ShapeXXXViewModel nen Template habe und für ShapeYYYViewModel und ich diese Klassen dann im DiagrammViewModel zurückgeliefert bekomme dann brauche ich doch wieder eine Variable in der ich sowohl ShapeXXXViewModel als auch ShapeYYYViewModel speichern kann? |
Genau, im Haupt-VM brauchst du eine Liste von
ShapeViewModels. Du castest nun aber eben nicht innerhalb des Haupt-VMs auf die einzelnen Ableitungen, sondern benutzt virtuelle Methoden von ShapeViewModel - Polymorhpismus, so wie er sein sollte.
Du musst also sicher nicht in jeder Ableitung von vorne beginnen, sondern nur die für diese Klasse einzigartige Logik durch Überschreiben hinzufügen (das musst du wohl so oder so irgendwo machen

). Alles andere gehört in die gemeinsame Basisklasse.
Mal ein kurzes Beispiel. Auf eine Trennung von Model und VM habe ich verzichtet, außerdem fehlt natürlich noch eine Prise INotifyPropertyChanged.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| public class Rectangle : Shape { public float Width { get; set; } public float Height { get; set; }
public override void MakeBigger() { base.MakeBigger(); } }
public class MainViewModel { public ObservableCollection<Shape> Shapes { get; private set; }
public MainViewModel() { Shapes = new ObservableCollection<Shape> { new Circle { Diameter = 10 }, new Rectangle { Width = 40, Height = 30, StrokeThickness = 5 } }; }
public void MakeBigger() { foreach (var shape in Shapes) shape.MakeBigger(); } } |
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| <Window.Resources>
<DataTemplate DataType="{x:Type my:Rectangle}"> <Rectangle StrokeThickness="{Binding StrokeThickness}" Width="{Binding Width}" Height="{Binding Height}" Fill="Red" Stroke="Black" /> </DataTemplate> <DataTemplate DataType="{x:Type my:Circle}"> <Ellipse StrokeThickness="{Binding StrokeThickness}" Width="{Binding Diameter}" Height="{Binding Diameter}" Fill="Blue" Stroke="Black" /> </DataTemplate> </Window.Resources> <ItemsControl ItemsSource="{Binding Shapes}" /> |