Как сделать UserControl, который может связываться с ItemsSource или DataContext? - PullRequest
0 голосов
/ 06 декабря 2010

Я пытаюсь написать простой редактор 2D-карт.Вот мой код до сих пор.Как мне кодировать класс UserControl, который привязывается к карте?Я не могу найти пример UserControl, который обрабатывает ItemsSource, как встроенные 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 голосов
/ 06 декабря 2010

Когда вы говорите «как встроенные ListBox и DataGrid», насколько вы похожи?Вы просто имеете в виду широкие возможности для работы с источником, подобным списку, или вы имеете в виду все, что они могут сделать - генерацию элементов, виртуализацию, шаблонирование элементов, стилизацию контейнеров и т. Д.

Механизмв ItemsControl, которая лежит в основе всей встроенной привязки списков в WPF, на удивление сложно, поэтому для воспроизведения потребуется огромное количество усилий.Хуже того, есть много мест, где другие биты WPF знают о ItemsControl и имеют специальную обработку для него.(Например, ScrollViewer и некоторые панели.) Поэтому даже невозможно создать собственную реализацию, которая делает то же самое, если вы также не напишите свои собственные замены для всех этих других частей.

ItemsControlэто одна из самых мощных функций WPF, но также и одна из наименее продуманных.По сути, если вам нужна его функциональность, вам, скорее всего, придется ее использовать.

Поэтому, если вы хотите, чтобы ваша UserControl включала в себя ItemsControl функциональность, вам нужно поместить внутри своего рода ItemsControlваш UserControl и просто подключите свойства вашей коллекции к их ItemsSource свойствам.Это может быть лучшим подходом, потому что вы получаете встроенную реализацию ItemsControl, которая сделает всю работу за вас.

Но если вы только хотите воспроизвести некоторые специфические функции, вы могли бы справитьсясобытия изменения коллекции.Но я бы пошел по этому пути, только если вы исчерпали возможность заставить ItemsControl сделать это для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...