我正在尝试编写一个简单的2D地图编辑器。到目前为止,这是我的代码。如何编写绑定到地图的UserControl类?我似乎无法找到一个处理ItemsSource的UserControl示例,就像内置的ListBox和DataGrid一样。我想我需要找出ItemsSource何时被设置然后编写订阅CollectionChanged和PropertyChanged并创建/删除/定位图像的代码?当我有3个ObservableCollections绑定到?
时,我是否应该尝试这样做?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 :(得分:0)
当你说“像内置的ListBox和DataGrid”时,你的意思有多相似?您是指具有类似列表的源的广泛能力,还是指他们能做的所有事情 - 项目生成,虚拟化,项目模板,容器样式等等?
在ItemsControl
中支持WPF中所有内置列表绑定的机制令人惊讶地复杂,因此重现这将是一项巨大的努力。更糟糕的是,有很多地方WPF的其他部分都知道ItemsControl
,并且对它有特殊处理。 (例如,ScrollViewer
和某些专家组。)因此,除非您也为所有其他部分编写自己的替代品,否则甚至不可能生成完全相同的实现。
ItemsControl
是WPF最强大的功能之一,但它也是最不重要的因素之一。基本上,如果你想要它的功能,你几乎必须使用它。
因此,如果您希望UserControl
包含ItemsControl
功能,则需要在ItemsControl
内放置某种UserControl
,并通过以下方式连接您的收藏品他们的ItemsSource
属性。这可能是最好的方法,因为您正在使用内置的ItemsControl
实现为您完成所有工作。
但是,如果您只想重现某些特定功能,则可以处理集合更改事件。但是如果你已经用尽ItemsControl
为你做这件事的选择,那么我只会走这条路。