如何创建可以绑定到ItemsSource或DataContext的UserControl?

时间:2010-12-06 00:43:10

标签: wpf user-controls mvvm

我正在尝试编写一个简单的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));
        }
    }
}

1 个答案:

答案 0 :(得分:0)

当你说“像内置的ListBox和DataGrid”时,你的意思有多相似?您是指具有类似列表的源的广泛能力,还是指他们能做的所有事情 - 项目生成,虚拟化,项目模板,容器样式等等?

ItemsControl中支持WPF中所有内置列表绑定的机制令人惊讶地复杂,因此重现这将是一项巨大的努力。更糟糕的是,有很多地方WPF的其他部分都知道ItemsControl,并且对它有特殊处理。 (例如,ScrollViewer和某些专家组。)因此,除非您也为所有其他部分编写自己的替代品,否则甚至不可能生成完全相同的实现。

ItemsControl是WPF最强大的功能之一,但它也是最不重要的因素之一。基本上,如果你想要它的功能,你几乎必须使用它。

因此,如果您希望UserControl包含ItemsControl功能,则需要在ItemsControl内放置某种UserControl,并通过以下方式连接您的收藏品他们的ItemsSource属性。这可能是最好的方法,因为您正在使用内置的ItemsControl实现为您完成所有工作。

但是,如果您只想重现某些特定功能,则可以处理集合更改事件。但是如果你已经用尽ItemsControl为你做这件事的选择,那么我只会走这条路。