2010-12-06 55 views
0

我想寫一個簡單的2D地圖編輯器。這是我的代碼到目前爲止。如何編碼綁定到地圖的UserControl類?我似乎無法找到像處理ListBox和DataGrid一樣處理ItemsSource的UserControl示例。我想我需要找出什麼時候設置ItemsSource,然後編寫訂閱了CollectionChanged和PropertyChanged的代碼並創建/刪除/定位圖片?當我有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最強大的功能之一,但它也是最不考慮因素之一。基本上,如果你想要它的功能,你幾乎不得不使用它。

所以,如果你希望你的UserControl包括ItemsControl功能,你需要把某種ItemsControlUserControl內,只是通過他們的ItemsSource性質連線您的收藏屬性。這可能是最好的方法,因爲您可以使用內置的ItemsControl實現爲您完成所有工作。

但是,如果您只想重現某些特定功能,則可以處理收集更改事件。但是如果你已經用盡了ItemsControl這個選項,我只能走下去。

+0

我以爲我只是需要創建/刪除/更新項目 - 但在快速實現(不使用MVVM)後,我發現我肯定需要虛擬化。加載/更改50x100圖像的網格非常慢。我將在ScrollViewer中放置一個大的畫布,並在OnScroll事件中創建/移除Images,以便只有屏幕上實際存在的內容纔會出現。 – 2010-12-06 14:20:20

相關問題