Использование Silverlight Hierarchical Entity Framework (http://silverlightfw.codeplex.com)
Ожидает приглашения
Использование Silverlight Hierarchical Entity Framework
Предположим, у нас есть некие обьекты:
public class Object
{
List<Object> Objects {get; set;}
List<Property> Properties {get; set;}
}
public class Property
{
string Name { get; set; }
}
Задача:
1) Создать привязки к UI на Silverlight, используя стандартные механизмы,
2) Использовать понятные имен свойств
3) Удостовериться, что имя обьекта никогда не будет null
Решение:
Для начала, определимся, что же не так в классх выше:
1) Для того, чтобы работал стандартный механизм привязок, небходимо, чтобы интерфейс пользователя получал уведомления при изменении тех или иных свойств. Для этого, как узнаем из MSDN, небходимо, чтобы объект, свовйтва которого используют привязки, реализовал интерфейс INotifyPropertyChanged
Читаем MSDN:
INotifyPropertyChanged уведомляет клиентов об изменении значения свойства.
2) Отображаются наши свойства так как мы их определили, то есть по английски, а хотелось бы использовать русские имена
Для этого можно воспользоваться стандартным механизмом, используя атрибуты DisplayAttribute. Например, так:
[Display(Name = «Свойства обьекта»)]
List<Property> Properties { get; set; }
3) Стандартные коллекции, в том числе List<T>, не наследуют интерфейс INotifyPropertyChanged, соответсвенно, при их изменнении, свойства данного типа не будут отображаться правильно
Ну, можно придумать свой фреймоворк, нацеленный на решение этих проблем, а можно воспользоваться моим решением:
Вот как выглядит конецный результат:
public class ObjectEntity : Entity<ObjectEntity>
{
private IEntity<string> _name;
private CollectionEntity<PropertyEntity> _properties;
private CollectionEntity<ObjectEntity> _objects;
public ObjectEntity()
{
_objects = new CollectionEntity<ObjectEntity>();
_properties = new CollectionEntity<PropertyEntity>();
_name = Entity<ObjectEntity, string>.Create(new ObjectEntityNameValidationValue("Name", this));
}
[Display(Name = "name")]
public string Name { get { return _name.Object; } set { _name.Object = value; } }
[Display(AutoGenerateField = false)]
public CollectionEntity<ObjectEntity> Objects { get { return _objects; } }
[Display(AutoGenerateField = false)]
public CollectionEntity<PropertyEntity> Properties { get { return _properties; } }
}
public class ObjectEntityNameValidationValue : EntityValidationValue<ObjectEntity, string>
{
public ObjectEntityNameValidationValue(string name, ObjectEntity owner) : base(name, owner) { }
public override bool Validate(string value)
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentNullException(Name);
}
return true;
}
}
Достоинства этого подхода:
1) достигаются все поставленные первичные задачи.
2) происходит сокрытие реализации, упрощающее разработку и сопровождение класса
Недостатки:
1) Использование своего дерева иерархии
Пути дальнейшего развития:
1) Замена иерархии наследования (закрытая система) на иерархию интерфейсов / атрибуты
2) Использование Reflection для дальнейшего абстрагирования задачи в второну униварсализации библиотеки.
Полный пример можно скачать по адресу silverlightentityfw.codeplex.com, там же находится документация.
Удачи!