Всвязи с наплывом сообщений по теме, решился опубликовать одно решение. Я не считаю его удачным, но зато оно простое в использовании как две копейки, да и показывает некоторые возможности работы с компонентной моделью.
Начнём с примера использования:
Файл с описанием классов бизнес-объектов
using System;
using System.ComponentModel;
using System.Diagnostics;
using MyCompany.ComponentModel;
namespace DefinePropertyModel
{
public class DataItem1
{
private string text;
public DataItem1()
{
}
public DataItem1(string text)
{
this.text = text;
}
public string Text
{
get { return text ?? String.Empty; }
set { text = value; }
}
}
[TypeDescriptionProvider(typeof(DefinePropertyTypeDescriptionProvider<DataItem2>))] // Подключаем свой поставщик свойств
[DefineProperty("Item1.Text")] // Определяем свойства
[DefineProperty("Item2.Text", "Text2")]
public class DataItem2
{
private readonly DataItem1 item1;
private readonly DataItem1 item2;
public DataItem2()
{
item1 = new DataItem1();
item2 = new DataItem1();
}
public DataItem2(string text1, string text2)
{
item1 = new DataItem1(text1);
item2 = new DataItem1(text2);
}
[Browsable(false)]
public DataItem1 Item1
{
[DebuggerStepThrough]
get { return item1; }
}
[Browsable(false)]
public DataItem1 Item2
{
[DebuggerStepThrough]
get { return item2; }
}
}
}
Использование, например, такое:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Forms;
using DefinePropertyModel;
using MyCompany.ComponentModel;
namespace WindowsApplication1
{
static class Program
{
[STAThread]
static void Main()
{
DataItem2 item = new DataItem2("Text #1", "text #2");
IList list = new List<DataItem2>();
foreach(PropertyDescriptor propertyDescriptor in ListBindingHelper.GetListItemProperties(list))
{
Debug.Print("Name: {0}, Type: {1}, Value: {2}", propertyDescriptor.Name, propertyDescriptor.PropertyType, propertyDescriptor.GetValue(item));
}//for
}
}
}
Описанные с помощью DefinePropertyAttribute свойства понимаются визуальными редактрами (объект можно добавить как DataSource к проекту, подключать к BindingSource и дальше: к гридам, другим элементам управления).
Исходники — в ответе.
... << RSDN@Home 1.2.0 alpha rev. 650>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re: [C# 2.0] Complex data-binding со свойствами вложенных об
Здравствуйте, vgrigor, Вы писали:
V>А ты всегда пишешь вообще без комментариев? V>И сам потом все помнишь что у тебя написано?
На самом деле да
В данном конкретном случае меня может оправдать разве лишь то сам я ничего, кроме класса аттрибута, не написал, только реализовал :о). Описание всех методов есть в МСДН — в базовых класах и интерфейсах. как использовать поле Expression аттрибута я показал. но, если что-то нечсно, я постараюсь, как смогу рассказать.
... << RSDN@Home 1.2.0 alpha rev. 652>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re: [C# 2.0] Complex data-binding со свойствами вложенных об
Здравствуйте, _FRED_, Вы писали:
> Я не считаю его удачным
почему ?
Только на РСДН помимо ответа на вопрос, можно получить еще список орфографических ошибок и узнать что-то новое из грамматики английского языка (c) http://www.rsdn.ru/forum/cpp/4720035.1.aspx
Здравствуйте, Serjio, Вы писали:
>> Я не считаю его удачным
S>почему ?
Извиняюсь за задержку с ответом
Данное решение было предназначено для следующей задачи: имеется набор связанных между собой бизнес-объектов. Хотелось (не мне, а тому, кто ставил передо мной задачи) просто разметить бизнес-объекты, что бы их напрямую можно было бы использовать для биндинга в представлении.
Получается, что логика представления (доступные в представлении поля) задаются в бизнес-моделе, тогда как должно быть наоборот: уровень представления должен определять, что (а не только "как") показывать.
Если вы хотите иметь "тонкого клиента", который только знает "как", но не должен знать "что", то вам, ИМХО, всё равно лучше на сервере разделить бизнес-объекты и объекты-представления и отдавать клиенту "объекты-представления".
Отдельные объекты-представления позволяют менять представление независимо от бизнес-модели, но, да: незначительно увеличится стоимость обновления представления при изменении бизнес-объектов. Но тут уже всё дело в используемых инструментальных средствах
Help will always be given at Hogwarts to those who ask for it.
Re[3]: [C# 2.0] Complex data-binding со свойствами вложенных
Здравствуйте, MozgC, Вы писали:
MC>А хорошего враппера реализующего INotifyPropertyChanged, IEditableObject, IChangeTracking, поддерживающего коллекции и т.д. у тебя не завалялось?
Нет, я предпочитаю каждый раз делать что-то новое исходя из имеющихся условий. В BLToolKit.ComponentModel смотрел?
Help will always be given at Hogwarts to those who ask for it.
Re[2]: [C# 2.0] Complex data-binding со свойствами вложенных
Здравствуйте, _FRED_, Вы писали:
_FR>>Исходники — в ответе.
По сообщениям доброжелателей, данный код перестал работать под четвёртым фреймворком, вызывая StackOverflowException. В связи с чем, было сделано одно небольшое изменение, которое будет работать под фреймворками от второго до четвёртого. Под более ранними не проверял.
Определение класса DefinePropertyTypeDescriptionProvider<T> должно быть проще:
// DefinePropertyTypeDescriptionProvider`1.csnamespace MyCompany.ComponentModel
{
public class DefinePropertyTypeDescriptionProvider<T> : TypeDescriptionProvider
{
#region Constructors\Finalizer
public DefinePropertyTypeDescriptionProvider() : base(TypeDescriptor.GetProvider(typeof(T))) { }
#endregion Constructors\Finalizer
#region Overrides
public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance) {
return new DefinePropertyTypeDescriptor(objectType, instance, base.GetTypeDescriptor(objectType, instance));
}
#endregion Overrides
}
}
_FR>Enjoy и welcome с критикой.
Help will always be given at Hogwarts to those who ask for it.