После того как окончательно убедился в удовлетворении меня шаблона MVVM и даже неких попыток написать на этом шаблоне систему "снуля", решил перечитать основы.
и к своему сожалению обнаружил, что делал систему совершенно неправильно.. Поэтому решил написать для самого себя, ну и конечно для того, кто это будет читать, некое описание этого паттерна.
Это то место в котором я буду выкладывать все свои соображения по реальным проектам, некоторые материалы для того, чтобы не забывать, ну и конечно много всего интересного.
пятница, 26 ноября 2010 г.
вторник, 7 сентября 2010 г.
Далее..
Далее стоит задача обработки документа Word (предположительно) через XML.
Понять:
1. В каком виде буду хранить документ
Предположительно будет храниться в виде docx файла. Шаблон в таком же виде, но в папках программы.
2. Каким образом он будет отображаться? А это вообще главный вопрос..
Отображение будет в виде RichBox.
3. По какому принципу редактировать. Пусть пользователь редактирует шаблоны, а мы только вставляем нужные данные в нужные места, или мы редактируем и шаблон и данные?
Пока что, пользователь набивает шаблон, далее загружает его в программу, выбирает реквизиты, которые будут заменяться в шаблоне, а в случае если нужных реквизитов не будет, пользователю будет предоставлена возможность добавить свои.
Так же пользователь сможет загрузить шаблон в программу, и редактировать его там же. Там же он будет определять реквизиты и после определения будет предоставлена возможность определения этих реквизитов.
4.Вот, что необходимо понять: как нужно хранить данные о реквизитах? Что я имею ввиду. Нужно ли давать пользователю возможность упорядочивания реквизитов, т.е. , если существует группа реквизитов относящихся к одной некой сущности, есть ли смысл выводить их в отдельную группу в базе данных?
Скорее всего да. Потому-что могут существовать некоторые повторяющиеся реквизиты.. но надо обдумать..
Понять:
Предположительно будет храниться в виде docx файла. Шаблон в таком же виде, но в папках программы.
2. Каким образом он будет отображаться? А это вообще главный вопрос..
Отображение будет в виде RichBox.
Пока что, пользователь набивает шаблон, далее загружает его в программу, выбирает реквизиты, которые будут заменяться в шаблоне
Так же пользователь сможет загрузить шаблон в программу, и редактировать его там же. Там же он будет определять реквизиты и после определения будет предоставлена возможность определения этих реквизитов.
4.Вот, что необходимо понять: как нужно хранить данные о реквизитах? Что я имею ввиду. Нужно ли давать пользователю возможность упорядочивания реквизитов, т.е. , если существует группа реквизитов относящихся к одной некой сущности, есть ли смысл выводить их в отдельную группу в базе данных?
Скорее всего да. Потому-что могут существовать некоторые повторяющиеся реквизиты.. но надо обдумать..
воскресенье, 5 сентября 2010 г.
Хозяйке на заметку 3. Атрибут Description.
Атрибут Description отвечает за интерпритацию полного имени класса, именем, которое мы задаем в атрибуте.
Чтобы вытащить этот атрибут необходима такая конструкция:
AttributeCollection attributes =
TypeDescriptor.GetAttributes(this);
/* this - это текущий класс из которого вытаскиваем атрибут*/
DescriptionAttribute myAttribute =
(DescriptionAttribute)attributes[typeof(DescriptionAttribute)];
Вот такая загагулина получилась(с)Гоблин.
Чтобы вытащить этот атрибут необходима такая конструкция:
AttributeCollection attributes =
TypeDescriptor.GetAttributes(this);
/* this - это текущий класс из которого вытаскиваем атрибут*/
DescriptionAttribute myAttribute =
(DescriptionAttribute)attributes[typeof(DescriptionAttribute)];
Вот такая загагулина получилась(с)Гоблин.
Хозяйке на заметку 2. Передача типа в метод.
Была задача по передаче типа в метод. Решается Generic-объектами.
public void CreateNewDocument<T>(String name)
{
switch (typeof(T).Name)
{
case "Contract": { return (IDocument)StaticFabric.Create(new CreateHandler(HowToCreateContract), name); }
case "Act": { return (IDocument)StaticFabric.Create(new CreateHandler(HowToCreateAct), name); }
default: { return null; }
}
}
т.е. Мы передаем тип при вызове метода (CreateNewDocument<Contract>("123")) и используем этот тип в методе.
public void CreateNewDocument<T>(String name)
{
switch (typeof(T).Name)
{
case "Contract": { return (IDocument)StaticFabric.Create(new CreateHandler(HowToCreateContract), name); }
case "Act": { return (IDocument)StaticFabric.Create(new CreateHandler(HowToCreateAct), name); }
default: { return null; }
}
}
т.е. Мы передаем тип при вызове метода (CreateNewDocument<Contract>("123")) и используем этот тип в методе.
среда, 1 сентября 2010 г.
Хозяйкена заметку1. TreeView и отображение диковинных структур.
Хозяйке на заметку:
1.Если не работает сложный биндинг, то стоит разбить задачу этого биндинга на мелкие подзадачи и проверить каждую из них на простых элементах, типа TextBlock.
Специфика задачи:
Нужно было отобразить данные в TreeView. Данные устроены особым образом:
МенеджерПриложения содержит хранилище, в нем есть коллекция, содержащая проекты.
У каждого проекта также есть хранилище, в котором есть коллекция документов (разных типов).
Нужно показать в дереве взаимоотношения проектов и документов.
К сожалению сходу этого не получилось, и долго ковырял волосы на затылке, в поисках решения проблемы. А все почему? А потому что из-за того, что Хранилище - абстрактный класс, и коллекция хранящаяся в нём так же должна была абстрагироваться, от типа, объекты которого хранятся в ней. И вследствие этого коллекцию я объявил, как коллекцию объектов Object, соответственно неявное привидение не срабатывало.
Решение: Упаковал все типы, которые мы будем хранить в интерфейс IObject, и Object поменял на IObject.
К слову.. Любые данные можно отобразить в TreeView благодаря конструкции
<HierarchicalDataTemplate DataType="{x:Type Docs:IDocument}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
В данном случае все объекты типа Idocument будут отображены как TextBlock, поле Text которого привязан к свойству Name отображаемого элемента.
Так же, если элемент содержит в себе другие, можно передать элементу коллекцию следующих и шаблон их отображения. Шаблон можно заменить такой же конструкцией, только определённой для другого типа.
1.Если не работает сложный биндинг, то стоит разбить задачу этого биндинга на мелкие подзадачи и проверить каждую из них на простых элементах, типа TextBlock.
Специфика задачи:
Нужно было отобразить данные в TreeView. Данные устроены особым образом:
МенеджерПриложения содержит хранилище, в нем есть коллекция, содержащая проекты.
У каждого проекта также есть хранилище, в котором есть коллекция документов (разных типов).
Нужно показать в дереве взаимоотношения проектов и документов.
К сожалению сходу этого не получилось, и долго ковырял волосы на затылке, в поисках решения проблемы. А все почему? А потому что из-за того, что Хранилище - абстрактный класс, и коллекция хранящаяся в нём так же должна была абстрагироваться, от типа, объекты которого хранятся в ней. И вследствие этого коллекцию я объявил, как коллекцию объектов Object, соответственно неявное привидение не срабатывало.
Решение: Упаковал все типы, которые мы будем хранить в интерфейс IObject, и Object поменял на IObject.
К слову.. Любые данные можно отобразить в TreeView благодаря конструкции
<HierarchicalDataTemplate DataType="{x:Type Docs:IDocument}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
В данном случае все объекты типа Idocument будут отображены как TextBlock, поле Text которого привязан к свойству Name отображаемого элемента.
Так же, если элемент содержит в себе другие, можно передать элементу коллекцию следующих и шаблон их отображения. Шаблон можно заменить такой же конструкцией, только определённой для другого типа.
Начало.
И так, приступим к созданию ,надеюсь, длинного блога. Будет посвящен он моим мыслям, умозаключениям по поводу разработки и повседневной жизни.
Подписаться на:
Сообщения (Atom)