2013-03-11 2 views
0

Я пишу пользовательский элемент управления с нуля (используя Graphics), который будет представлять собой набор столбцов, каждый из которых будет иметь список ячеек, очень похожий на сетку кроме этого, будут иметь некоторые пользовательские функции.Как управлять привязками данных в 100% настраиваемом элементе управления сетью

Мне сложно найти способ управления всей проблемой привязки данных. Я бы хотел, чтобы эта сетка имела свойство DataSource, которое в основном должно было быть зубчатым массивом (2D) некоторых объектов, каждый из которых должен был бы привязываться к ячейке в элементе управления. Я все еще не уверен, какие свойства у каждого из этих объектов будут, и до сих пор я использую только текст. То, что я пытаюсь сделать, это моя модель реализовать этот интерфейс:

public interface IDiagramDataSource 
{ 
    IBindingList Columns { get; } 
} 

и тогда каждый столбец это реализовать:

public interface IDiagramColumnDataSource : INotifyPropertyChanged 
{ 
    IBindingList Cells { get; } 
} 

Но я до сих пор с трудом выясняя лучший способ сохранить все эти объекты синхронизированными с соответствующими объектами в моей сетке. Мне бы хотелось, чтобы у меня была возможность связать весь обязательный беспорядок в независимом классе, но не знаю, как это сделать. Пока что я просто перекрашу все это, всякий раз, когда есть какие-либо изменения в источнике данных, но я хотел бы в конечном итоге определить, какое свойство, в котором ячейка или какая ячейка, в которой был изменен столбец, чтобы я мог обновлять только необходимые предметы в моей сетке.

Есть ли какой-либо шаблон, который следует отслеживать, если вы хотите, чтобы элемент управления был привязан к вложенным спискам? Я предполагаю, что с этого момента контроль DataGridView.

+1

'очень похоже на сетку, за исключением того, что у нее будут некоторые пользовательские функции.' - Могу ли я спросить, каковы эти пользовательские функции? –

+0

Это будет фактически как блок-схема. Каждая ячейка будет иметь стрелку, которая будет указывать на ближайшую ненулевую ячейку справа (поэтому она может расширяться поверх других столбцов). Вы сможете перемещать ячейки вверх и вниз (не всю строку). И, вероятно, другие вещи, которые я до сих пор не знаю. – Juan

+0

'' это будет на самом деле «звучит так, как будто вы еще не слишком глубоко в него вошли. Просто предложение .. вы считали WPF для этого? это может быть намного проще сделать такую ​​продвинутую вещь (с точки зрения пользовательского интерфейса) в WPF, что winforms –

ответ

0

Я хотел бы предложить 2 вариант:

Первое предложение было предложено HighCore, заключается в использовании WPF, а не пользовательский объект Winform, чтобы сделать работу. WPF также имеет гораздо больше элементов управления (ListView, даже общий ItemContainer, если я не ошибаюсь). Просто реализуйте INotifyPropertyChanged в ViewModel, затем вызывайте OnPropertyChanged для элемента root (aggregate) каждый раз, когда вам нужно обновить элемент управления. Не забудьте добавить UpdateSourceTrigger для привязки ItemsSource. Элементы управления WPF также имеют хорошую реализацию для функции перетаскивания.

Я не буду подробно описывать реализацию в WPF, поскольку есть много статей, объясняющих это.

Однако, если вы считаете, что это необходимо сделать с помощью пользовательского графического рисунка, то это довольно сложно. Вы должны вызвать метод для повторного рисования контрольной графики каждый раз, когда любые изменения, произошедшие в списке элементов, будут действовать. Будет лучше, если вы можете сделать частичное обновление вашей графики (возможно, используя панели, чтобы обмануть ее), но это сложнее.

Если не обрабатывается правильно (более того, если ваш элемент управления содержит огромное количество данных и/или размер управления), это может вызвать некоторые большие нагрузки на память.

+0

В дополнение к этому стоит упомянуть, что нет необходимости в «пользовательском рисовании» в WPF. Не в смысле необходимости кодировать все вещи на C#, как в winforms.WPF поддерживает концепцию 'ControlTemplates', а также' DataTemplates', которые определены в XAML (гораздо проще и более масштабируемы, чем winforms), а WPF использует сохраненную графику, поэтому вам не нужно делать какие- draw ", структура заботится о повторной компоновке и повторной рендеринге сама по себе всякий раз, когда соответствующее свойство изменяется в любом элементе пользовательского интерфейса. См. DependencyProperty и AffectsRender в MSDN. –

Смежные вопросы