Существует два подхода к рисованию временных шкал.
Привязка данных и код позади
Первый использует привязку данных , котораявы уже на полпути;Таким образом, вы определяете модель данных и шаблон данных, запись в модели может иметь такие свойства, как Имя , Рожденный и Женат и Рожденные и Женат имеет целочисленное значение, например 1980, для обозначения года, а шаблон данных определяет способ визуального представления записи.
Другой подход заключается в использовании кода позади, построении Canvas
и рисовании линий, меток на Canvas
... с использованием C #, а затем вставке Canvas
в ячейку DataGrid
.
Проблема:
А теперь вы застряли, потому что вы надеетесь смешать их, сначала используйте привязку данных, чтобы заполнить некоторые строки в DataGrid
из данныхмодели, каждая строка имеет метку Name
и Canvas
, затем вы хотите получить доступ к Canvas
для рисования с использованием кода позади.Поскольку Canvas
создается с использованием привязки данных, вам трудно получить ссылку на него, вы даже не можете получить к нему доступ с именем TimelineCanvas
, так как это имя имеет «область видимости шаблона» - то есть оно доступно толькоиз шаблона.
Можно получить доступ к Canvas из кода, используя VisualTreeHelper .См. Как: Найти элементы, сгенерированные DataTemplate .Но я не рекомендую этот «смешанный подход».
Решение
Придерживайтесь либо привязки данных (если вас устраивает XAML), либо кода.
Если вы выберете привязку данных, добавьте строки и метки внутренности DataTemplate
, разумеется, вам необходимо рассчитать их положение на холсте - связав некоторые свойства в модели.
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Canvas Name="TimelineCanvas">
<Label Content="Born" Canvas.X="30" Canvas.Y="20" />
<Line
X1="10" Y1="30"
X2="350" Y2="30"
Stroke="Blue"
StrokeThickness="1" />
<!--The whole data template can be quite complicated, but here I just hard code a label and a line to get you started-->
</Canvas>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
Если вы выберете код, удалите CellTemplate
.
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Canvas Name="TimelineCanvas"></Canvas>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
По моему мнению, оба подхода довольно сложны, вы можете определить UserControl для Timeline
, поэтому логика построения может быть изолирована в одном отдельном классе.