Я пишу инструмент, который обращается к текстовому документу, чтобы предварительно заполнить его данными. Документ имеет подмножество настраиваемых свойств документа , каждое из которых идентифицируется именем, значения которого используются для обновления полей в документе.
Моя ViewModel должна иметь возможность запускать / обновлять свои экземпляры из данных этих свойств документа, а также записывать свои значения и обновлять поля документа.
Примерно так:
class PersonVM : INotifyPropertyChanged
{
// properties
string Name { get; set; }
string PhoneNumber { get; set; }
// methods to get data or save data of this properties to or from the word document
void saveMyPropertyValuesToWord()
{
// …
}
void updateMyPropertiesFromWord()
{
// …
}
}
class ProjectVM : INotifyPropertyChanged
{
int ProjectNumber { get; set; }
PersonVM Manager { get; set; }
PersonVM Mechanic1 { get; set; }
PersonVM Mechanic2 { get; set; }
void saveMyPropertyValuesToWord()
{
Manager.saveMyPropertyValuesToWord();
Mechanic1.saveMyPropertyValuesToWord();
Mechanic2.saveMyPropertyValuesToWord();
// handle ProjectNumber etc.
}
void updateMyPropertiesFromWord()
{
Manager.updateMyPropertiesFromWord();
Mechanic1.updateMyPropertiesFromWord();
Mechanic2.updateMyPropertiesFromWord();
// handle ProjectNumber etc.
}
class CompanyVM : INotifyPropertyChanged
{
string Name { get; set; }
PersonVM Owner { get; set; }
ProjectVM Project1 { get; set; }
ProjectVM Project2 { get; set; }
// …
}
// …
}
Прямо сейчас у меня есть класс со stati c строковыми свойствами для каждого свойства документа, которое может присутствовать в текстовом документе, из которого я хотел бы загрузить данные соответственно:
class WordUtils
{
// Company
static string CompanyName = "dp_CompanyName";
// Company.Owner
static string CompanyOwnerName = "dp_CompanyOwnerName";
static string CompanyOwnerPhone = "dp_CompanyOwnerPhone";
// Company.Project1
static string CompanyProject1Number = "dp_CompanyProject1Number";
// Company.Project1.Manager
static string CompanyProject1ManagerName = "dp_CompanyProject1ManagerName";
static string CompanyProject1ManagerPhone = "dp_CompanyProject1ManagerPhone";
// Company.Project1.Mechanic1
// … etc
}
Теперь вернемся к реализации этих PersonVM.saveMyPropertyValuesToWord()
- я подумал о чем-то вроде этого:
void saveMyPropertyValuesToWord()
{
Name = MyApp.MyWordDocument.GetCustomProperty(WordUtils.OwnerName);
}
, но здесь мне нужно точно знать на уровне класса, из какого экземпляра он вызывается (т.е. какой PersonVM я, Company.Owner или Project1.Manager или?), чтобы решить, какое WordUtils.Name мне нужно предоставить.
Я не уверен, как это должно быть сделано, может быть, сделать PersonVM абстрактным и создать новый класс для каждой роли (который снова будет иметь только один экземпляр, что не очень красиво в моих глазах)? Я также кратко рассмотрел атрибуты и ожидаю, что они могут быть полезны в этом сценарии. Может быть, мне не хватает чего-то очевидного, но обширные поиски надежного способа решения этой проблемы пока что безрезультатны.