2010-12-06 14 views
0

Ich versuche, einen einfachen 2D-Karteneditor zu schreiben. Hier ist mein Code soweit. Wie programmiere ich die UserControl-Klasse, die an eine Zuordnung bindet? Ich kann nicht scheinen, ein Beispiel eines UserControl zu finden, das die ItemsSource wie das eingebaute ListBox und das DataGrid behandelt. Ich denke, ich muss herausfinden, wenn ItemsSource gesetzt wird und dann Code schreiben, der CollectionChanged und PropertyChanged abonniert und Images erstellt/löscht/positioniert? Sollte ich das überhaupt versuchen, wenn ich 3 ObservableCollections habe, an die ich mich binden kann?Wie erstelle ich ein UserControl, das an eine ItemsSource oder DataContext binden kann?

public class Map 
{ 
    public ObservableCollection<ObservableCollection<MapSquare>> Squares 
     = new ObservableCollection<ObservableCollection<MapSquare>>(); 
} 

public class MapSquare 
{ 
    public ObservableCollection<MapTile> Items = new ObservableCollection<MapTile>(); 
} 

public class MapTile : INotifyPropertyChanged 
{ 
    private CroppedBitmap bmp; 
    public CroppedBitmap Bitmap { 
     get{return bmp;} 
     set{ bmp = value; OnPropertyChanged("Bitmap");} 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

Antwort

0

Wenn Sie sagen "wie die eingebaute ListBox und DataGrid", wie ähnlich meinen Sie? Meinst du nur die breite Fähigkeit, mit einer listenähnlichen Quelle umzugehen, oder meinst du alles, was sie tun können - Item-Generierung, Virtualisierung, Artikeltemplating, Container-Styling und so weiter?

Der Mechanismus in ItemsControl, der die gesamte integrierte Listenbindung in WPF untermauert, ist überraschend kompliziert, daher wäre es ein enormer Aufwand, ihn zu reproduzieren. Schlimmer noch, es gibt viele Orte, wo andere Teile von WPF über ItemsControl wissen und spezielle Handhabung dafür haben. (Z. B. ScrollViewer und bestimmte Panels.) Es ist also nicht einmal möglich, eine eigene Implementierung zu erstellen, die dasselbe tut, es sei denn, Sie schreiben auch Ihre eigenen Ersetzungen für all diese anderen Teile.

ItemsControl ist eine der mächtigsten Funktionen von WPF, aber es ist auch eine der am wenigsten gut durchdachte. Grundsätzlich, wenn Sie seine Funktionalität wollen, müssen Sie es ziemlich verwenden.

Also, wenn Sie möchten, dass Ihre UserControlItemsControl Funktionalität enthalten, müssen Sie irgendeine Art von ItemsControl in Ihrem UserControl setzen und Draht nur Ihre Sammlung Eigenschaften bis hin zu den ItemsSource Eigenschaften. Das ist wahrscheinlich der beste Ansatz, denn Sie erhalten die integrierte Implementierung ItemsControl, um die gesamte Arbeit für Sie zu erledigen.

Wenn Sie jedoch nur bestimmte Funktionen reproduzieren möchten, können Sie die Sammlungsänderungsereignisse verarbeiten. Aber ich würde nur diesen Weg gehen, wenn Sie die Option, ItemsControl zu bekommen, um es für Sie zu tun, erschöpft haben.

+0

Ich dachte, ich müsste nur Elemente erstellen/löschen/aktualisieren - aber nach einer schnellen Implementierung (ohne MVVM) entdecke ich, dass ich definitiv Virtualisierung brauche. Laden/Ändern eines Rasters von 50x100 Bildern ist sehr, sehr langsam. Ich werde eine große Leinwand in einen ScrollViewer einfügen und im OnScroll-Event werde ich Bilder erstellen/entfernen, so dass nur das vorhanden ist, was auf dem Bildschirm angezeigt wird. –

Verwandte Themen