Ваша модель предметной области при переводе в таблицы базы данных будет противоречить принципам нормализации базы данных.
Проблема : Столбцы уровней в объекте категории создадут избыточность, и не будет необходимости упоминать изменение в модели, если позже вы выясните, что есть больше уровней для размещения.
Решение : Вот что я предлагаю вам:
Шаг 1. Измените свою сущность и создайте отношения между родителями и детьми следующим образом:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace DomainModel
{
public class Category
{
public Category()
{
Children = new HashSet();
}
public int Id { get; set; }
[Required]
public string Name { get; set; }
public int? ParentId { get; set; }
public virtual ICollection Children { get; set; }
public virtual Category Parent { get; set; }
}
}
Родительско-дочерние отношения позволяют вам создавать столько уровней, сколько вам нужно. Если категория не принадлежит уровню (другими словами, это корневая категория), ее родитель будет нулевым.
Шаг 2. В методе OnModelCreating () вашего класса DbContext укажите отношение следующим образом:
modelBuilder.Entity()
.HasMany(e => e.Children)
.WithOptional(e => e.Parent)
.HasForeignKey(e => e.ParentId);
Конечная таблица в базе данных будет выглядеть так:
Я создал бы составной элемент управления с панелью стека блоки управления и текстовые блоки слева, которые Вы будете использовать для обработки нумерации строк. Если Вы обеспокоены количеством строк и имеющий слишком много визуальных элементов, то Вы могли использовать ListBox в виртуальном режиме.
необходимо было бы сцепиться до различных событий на RichTextBox так, чтобы Вы знали, когда обновить ListBox, а также вычислить высоту каждой строки, но это должно быть выполнимо с FlowDocument, присоединенным к RichTextBox.
"Защищенные" поддержки RichText - недоступный для редактирования - промежутки. Вы могли вывести свои номера строки, поскольку защищенный текст охватывает как часть потока RTF (когда Вы делаете свое форматирование).
В Формах Победы, можно использовать RichTextBox. Свойство SelectionProtected. WPF должен иметь что-то подобное.
Таким образом, все Ваши базовые линии будут корректны, и Вы не должны будете делать никаких дополнительных взглядов/программирования, чтобы заставить редактора вести себя правильно. Доступный для редактирования текст будет доступен для редактирования, и номера строки не будут.
Только вниз сторона - то, что необходимо повторно отправить поток RTF после каждого редактирования. Но я предполагаю, что Вы уже делали это для обеспечения форматирования синтаксического анализа / диагностика ошибок / безотносительно.
Как насчет того, чтобы использовать обогащенный текст AqiStar управление WPF? AqiStar. Текстовое поле
я не работаю на них... Я просто знаю, что Oren использует этот продукт в своем Профилировщике NHibernate (NHProf), и он, кажется, роет его.