2010-12-06 7 views
0

私は単純な2Dマップエディタを作成しようとしています。これまでのところ私のコードです。マップにバインドするUserControlクラスをコーディングするにはどうすればよいですか? ListBoxとDataGridに組み込まれているようなItemsSourceを処理するUserControlの例は見当たりません。私は、ItemsSourceがいつ設定されるのかを知り、CollectionChangedとPropertyChangedを購読し、Imagesを作成/削除/位置づけるコードを書く必要があると思っていますか? 3 ObservableCollectionsをバインドするときに私はこれをやろうとしているべきですか?ItemsSourceまたはDataContextにバインドできるUserControlを作成するにはどうすればよいですか?

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

答えて

0

「組み込みのListBoxとDataGridのように」、どのように似ていますか?あなたは、リストのようなソースに対処するための幅広い能力を意味するのでしょうか、あるいはアイテムの生成、仮想化、アイテムのテンプレート化、コンテナのスタイリングなど、彼らができるすべてのことを意味していますか?

ItemsControlのメカニズムは、WPFのビルトインリストバインディングをすべてサポートするため、驚くほど複雑なので、再現するには膨大な労力が必要です。さらに悪いことに、WPFの他のビットが約ItemsControlを知っている場所がたくさんあり、特別な処理があります。 (例えば、ScrollViewerと特定のパネルです。)したがって、他のすべての部品の独自の代替部品も作成しない限り、まったく同じことを行う独自の実装を作成することさえできません。

ItemsControlは、WPFの最も強力な機能の1つでもありますが、それは最もよく考慮されていない機能の1つです。基本的に、その機能を使いたい場合は、それを使う必要があります。

あなたのUserControlItemsControl機能を含めたいのであれば、あなたはあなたのUserControlItemsControlのいくつかの並べ替えを入れて、ちょうど彼らのItemsSourceの特性に至るまで、あなたのコレクションのプロパティを配線する必要があります。これは、組み込みのItemsControl実装がすべての作業を行うようになっているため、最良のアプローチである可能性があります。

しかし、特定の機能を再現したい場合は、コレクションの変更イベントを処理できます。しかし、もしあなたがItemsControlを手に入れようとする選択肢を使い果たしてしまったら、私はその道を辿るしかありません。

+0

私はアイテムを作成/削除/更新する必要があると思っていましたが、すぐに実装した後(MVVMを使用しないで)、私は仮想化が必要であることを発見しました。 50x100画像のグリッドのロード/変更は非常に遅いです。私は大きなキャンバスをScrollViewerの中に入れ、OnScrollイベントでは画像を作成/削除して、画面上に表示されるものだけが実際にそこにあるようにします。 –

関連する問題