Aggiungi le informazioni di forma a un ListView quando è stato creato

Im creando forms (rettangoli, ellissi, linee) in una canvas. E poi ho in un’altra finestra un listview in cui ho bisogno di inserire le informazioni della forma (come la posizione, la dimensione, la forma).

Ho questo codice in XAML in un’altra finestra:

           

e in c # della finestra principale, ho una collezione osservabile e questo codice:

 ObservableCollection shapes = new ObservableCollection(); myRect.Width = var1; myRect.Height = var2; Page.Children.Add(myRect); Canvas.SetLeft(myRect, posx); Canvas.SetTop(myRect, posy); shapes.Add(myRect); 2ndwindow.Information.ItemsSource = shapes; // this is working because the 2ndwindow is owned by the mainwindow 

EDIT: sono riuscito a bind larghezza e altezza, ma non so come bind la posizione e la forma che è (rettangolo o ellisse)

In un corretto approccio MVVM, dovresti avere un modello di vista con una rappresentazione astratta di una forma (invece di una lista di elementi dell’interfaccia utente), ad esempio in questo modo:

 public class ShapeData { public string Type { get; set; } public Geometry Geometry { get; set; } public Brush Fill { get; set; } public Brush Stroke { get; set; } public double StrokeThickness { get; set; } } public class ViewModel { public ObservableCollection Shapes { get; } = new ObservableCollection(); } 

Ora puoi associare questo modello di vista a una vista come mostrato di seguito. La posizione e la dimensione di ogni forma vengono recuperate dalla proprietà Bounds della Geometry di un object forma.

                              

È ansible creare un’istanza del modello di visualizzazione nel costruttore della finestra e aggiungere alcuni dati di esempio come questo:

 public MainWindow() { InitializeComponent(); var viewModel = new ViewModel(); viewModel.Shapes.Add(new ShapeData { Type = "Circle", Geometry = new EllipseGeometry(new Point(100, 100), 50, 50), Fill = Brushes.Orange, Stroke = Brushes.Navy, StrokeThickness = 2 }); viewModel.Shapes.Add(new ShapeData { Type = "Rectangle", Geometry = new RectangleGeometry(new Rect(200, 50, 50, 100)), Fill = Brushes.Yellow, Stroke = Brushes.DarkGreen, StrokeThickness = 2 }); DataContext = viewModel; }