2010-12-06 14 views
0

J'essaie d'écrire un éditeur de carte 2D simple. Voici mon code jusqu'à présent. Comment puis-je coder la classe UserControl qui se lie à une carte? Je n'arrive pas à trouver un exemple de UserControl qui gère le ItemsSource comme le font ListBox et DataGrid. Je pense que j'ai besoin de savoir quand ItemsSource est défini, puis écrire du code qui s'abonne à CollectionChanged et PropertyChanged et crée/supprime/positionne les images? Devrais-je même essayer de le faire quand j'ai 3 ObservableCollections à lier?Comment créer un UserControl pouvant être lié à un objet ItemsSource ou DataContext?

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)); 
     } 
    } 
} 

Répondre

0

Lorsque vous dites "comme le construit dans ListBox et DataGrid", comment voulez-vous dire? Est-ce que vous voulez simplement parler de la possibilité de traiter une source semblable à une liste, ou voulez-vous dire tout ce qu'ils peuvent faire - la génération d'éléments, la virtualisation, la modélisation d'éléments, le style de conteneur, etc.

Le mécanisme de ItemsControl qui sous-tend toutes les liaisons de liste intégrées dans WPF est étonnamment compliqué, ce qui représente un énorme effort de reproduction. Pire, il y a beaucoup d'endroits où d'autres morceaux de WPF connaissent ItemsControl et ont une manipulation spéciale pour cela. (Par exemple, ScrollViewer et certains panneaux.) Il n'est donc même pas possible de produire votre propre implémentation qui fait exactement la même chose à moins que vous n'écriviez aussi vos propres remplacements pour toutes ces autres parties.

ItemsControl est l'une des fonctionnalités les plus puissantes de WPF, mais c'est aussi l'une des moins bien factorisées. Fondamentalement, si vous voulez sa fonctionnalité, vous devez l'utiliser.

Donc, si vous voulez que votre UserControl pour inclure la fonctionnalité ItemsControl, vous aurez besoin de mettre une sorte de ItemsControl dans votre UserControl et fil simplement vos propriétés de collection à travers leurs ItemsSource propriétés. C'est peut-être la meilleure approche parce que vous obtenez l'implémentation ItemsControl intégrée pour faire tout le travail pour vous. Mais si vous ne cherchez qu'à reproduire certaines fonctionnalités spécifiques, vous pouvez gérer les événements de changement de collection. Mais je ne ferais que suivre ce chemin si vous avez épuisé l'option d'obtenir ItemsControl pour le faire pour vous.

+0

Je pensais que j'allais simplement avoir besoin de créer/supprimer/mettre à jour des éléments - mais après une implémentation rapide (sans utiliser MVVM), je découvre que je vais définitivement avoir besoin de virtualisation. Chargement/modification d'une grille de 50x100 Les images sont très très lentes. Je vais mettre une grande toile à l'intérieur d'un ScrollViewer et dans l'événement OnScroll je vais créer/supprimer des images afin que seul ce qui serait à l'écran soit réellement là. –