Wie de titel leest zal waarschijnlijk denken dat dit makkelijk te beantwoorden is: serialization, linq to xml, maar dit is voor mijn toepassing echter niet bruikbaar.
Ik ben namelijk bezig met een Visual Studio Extension die toelaat makkelijker bepaalde xml bestanden te wijzigen. Het idee dat ik nu heb, om intern dingen eenvoudiger te houden, is om de volledige xml file te synchroniseren met objecten. Net zoals je zou serialisen, maar dan wel met updates. Node toevoegen aan xml betekent dat een object aangemaakt wordt in mijn custom object. En omgekeerd: Het wijzigen van een property in mijn object moet ervoor zorgen dat die ook aangepast wordt in het xml document. Voorbeeld hiervan is de XAML designer in visual studio. Daar wordt ook een designer en een code view constant gesynchroniseerd met elkaar.
Deze functionaliteit zit al voor een deel in Visual Studio zelf via: MSDN: XmlModel Class (Microsoft.VisualStudio.XmlEditor). Deze classe geeft een XDocument weer die constant live upgedate wordt als je iets veranderd in de text editor.
Tot daar alles goed, echter bij het synchroniseren met mijn objecten gaat het mis. Bestaat hier eigelijk geen framework of zo voor?
Wat ik wil is objecten die een event sturen als iets gewijzigd is aan de properties, of als er een nieuwe child geassigned wordt. Wijzigingen in de child zelf worden door een eigen event aangegeven. Ook moeten childs met dezelfde naam en dezelfde parent in een observablecollection komen.
Het moeilijke is dat de XElement classe zelf weinig events heeft met duidelijke herkomt van het event. Je kunt bijvoorbeeld een event binnen krijgen dat een node verwijderd is, maar je weet dan niet meer van welke parent die afkomstig is, omdat die node op dat ogenblik al losgekoppeld is van zijn parent. Ook is het helemaal niet simpel om children zelf bij te houden in een ObservableCollection, rekening houdende met de positie van de childs in de parent. Ook moeten de objecten hierbij hergebruikt worden, dus niet zomaar telkens nieuwe instance aanmaken voor elke XElement.Elements(). Er moet dus rekening mee gehouden worden dat children kunnen opschuiven doordat er een nieuwe bijkomt.
Zelf overerven van XElement, en in de properties de data uit het XElement zelf uitlezen zou er wel voor zorgen dat ik steeds de meest recente data heb, maar dat is niet volledig wat ik wil. Telkens er data opgehaald wordt zouden nieuwe objecten gemaakt worden. Het zal dus niet meer mogelijk zijn om data die al in het bovenliggend viewmodel zit te gaan vergelijken. Ook zijn er bij deze oplossing geen notifications mogelijk als een object gewijzigd is. Deze oplossing is ook hier voorgesteld: http://stackoverflow.com/...ement-into-custom-objects
Een voorbeeld is misschien volgende file: http://www.w3schools.com/xml/cd_catalog.xml. Er zou dan moeten een observable list gemaakt worden, genaamd Catalog, die CD objecten bevat. Als in de achterliggende XElement een child toegevoegd wordt, dan moet die ook op de juiste plaats in de list komen.
De bedoeling van dit alles is om een tussenschakel te vormen tussen de XElement's die Visual Studio maakt, en een eigengemaakt viewmodel.
Ik heb al veel zitten sukkelen, en ooit kom ik er wel uit. Echt heel concrete vragen heb ik ook niet. Wat ik wel graag zou weten is hoe jullie dit zouden aanpakken. Ik krijg meer en meer het gevoel dat hier al standaard oplossingen voor zijn, die makkelijk te implementeren zijn. Waarschijnlijk ben ik het wiel opnieuw aan het uitvinden. Hopelijk kunnen jullie mij wat helpen mij beter inzicht te geven, over hoe dit probleem aangepakt moet worden.
Ik ben namelijk bezig met een Visual Studio Extension die toelaat makkelijker bepaalde xml bestanden te wijzigen. Het idee dat ik nu heb, om intern dingen eenvoudiger te houden, is om de volledige xml file te synchroniseren met objecten. Net zoals je zou serialisen, maar dan wel met updates. Node toevoegen aan xml betekent dat een object aangemaakt wordt in mijn custom object. En omgekeerd: Het wijzigen van een property in mijn object moet ervoor zorgen dat die ook aangepast wordt in het xml document. Voorbeeld hiervan is de XAML designer in visual studio. Daar wordt ook een designer en een code view constant gesynchroniseerd met elkaar.
Deze functionaliteit zit al voor een deel in Visual Studio zelf via: MSDN: XmlModel Class (Microsoft.VisualStudio.XmlEditor). Deze classe geeft een XDocument weer die constant live upgedate wordt als je iets veranderd in de text editor.
Tot daar alles goed, echter bij het synchroniseren met mijn objecten gaat het mis. Bestaat hier eigelijk geen framework of zo voor?
Wat ik wil is objecten die een event sturen als iets gewijzigd is aan de properties, of als er een nieuwe child geassigned wordt. Wijzigingen in de child zelf worden door een eigen event aangegeven. Ook moeten childs met dezelfde naam en dezelfde parent in een observablecollection komen.
Het moeilijke is dat de XElement classe zelf weinig events heeft met duidelijke herkomt van het event. Je kunt bijvoorbeeld een event binnen krijgen dat een node verwijderd is, maar je weet dan niet meer van welke parent die afkomstig is, omdat die node op dat ogenblik al losgekoppeld is van zijn parent. Ook is het helemaal niet simpel om children zelf bij te houden in een ObservableCollection, rekening houdende met de positie van de childs in de parent. Ook moeten de objecten hierbij hergebruikt worden, dus niet zomaar telkens nieuwe instance aanmaken voor elke XElement.Elements(). Er moet dus rekening mee gehouden worden dat children kunnen opschuiven doordat er een nieuwe bijkomt.
Zelf overerven van XElement, en in de properties de data uit het XElement zelf uitlezen zou er wel voor zorgen dat ik steeds de meest recente data heb, maar dat is niet volledig wat ik wil. Telkens er data opgehaald wordt zouden nieuwe objecten gemaakt worden. Het zal dus niet meer mogelijk zijn om data die al in het bovenliggend viewmodel zit te gaan vergelijken. Ook zijn er bij deze oplossing geen notifications mogelijk als een object gewijzigd is. Deze oplossing is ook hier voorgesteld: http://stackoverflow.com/...ement-into-custom-objects
Een voorbeeld is misschien volgende file: http://www.w3schools.com/xml/cd_catalog.xml. Er zou dan moeten een observable list gemaakt worden, genaamd Catalog, die CD objecten bevat. Als in de achterliggende XElement een child toegevoegd wordt, dan moet die ook op de juiste plaats in de list komen.
De bedoeling van dit alles is om een tussenschakel te vormen tussen de XElement's die Visual Studio maakt, en een eigengemaakt viewmodel.
Ik heb al veel zitten sukkelen, en ooit kom ik er wel uit. Echt heel concrete vragen heb ik ook niet. Wat ik wel graag zou weten is hoe jullie dit zouden aanpakken. Ik krijg meer en meer het gevoel dat hier al standaard oplossingen voor zijn, die makkelijk te implementeren zijn. Waarschijnlijk ben ik het wiel opnieuw aan het uitvinden. Hopelijk kunnen jullie mij wat helpen mij beter inzicht te geven, over hoe dit probleem aangepakt moet worden.
[ Voor 9% gewijzigd door Verwijderd op 22-01-2013 21:29 ]