Ik heb een applicatie in WPF die gebruik maakt van een service reference. De service reference genereert vanzelf voor mij een class Setup die ik nodig heb in de communicatie met de webservice. Deze class heeft (onder andere) een property UserId (integer) die het ID van een user aangeeft. Voor de rest heeft deze class geen informatie over de user (want dat zou dubbelop zijn).
De informatie over alle users komt via een aparte webmethod binnen die simpelweg een lijstje users en hun details ophaalt. Dit lijstje users sla ik op (in Service.Users) zodat ik er later naar kan refereren.
Om nu vanuit de class Setup de naam van de User te krijgen heb ik een nieuwe partial Setup class aangemaakt waarin ik een read-only property Username toevoeg. Deze property kijkt of een username backing field leeg is, en zo ja haalt de username eventjes op uit de Service.Users lijste:
Waar het dus om gaat is dat ik in een partial class een property Username toevoeg, welke de username ophaalt (vanuit het UserId wat bekend is).
Mijn probleem is nu dat de UserId property kan veranderen. De verandering van UserId wordt netjes aan mijn views doorgegeven omdat die property RaisePropertyChanged aanroept. Maar de Username wordt niet opnieuw opgehaald uiteraard, omdat er niet doorgegeven wordt dat die ook moet veranderen. Resultaat is dat de Username niet veranderd (in mijn views) als ik de user verander.
Hoe zorg ik er nu voor dat RaisePropertyChanged ook voor de Username property aangeroepen wordt? Ik kan niet in de UserId property gaan zitten schrijven want die is autogenerated.
De enige optie die ik zie is de Setup class naar zijn eigen PropertyChanged event te laten luisteren, en als UserId veranderd dan nog even RaisePropertyChanged oproepen voor Username. Maar dat lijkt heel erg omslachtig, en ook een beetje vreemd. Er moet toch wel een mooiere manier zijn om dit op te lossen?
De informatie over alle users komt via een aparte webmethod binnen die simpelweg een lijstje users en hun details ophaalt. Dit lijstje users sla ik op (in Service.Users) zodat ik er later naar kan refereren.
Om nu vanuit de class Setup de naam van de User te krijgen heb ik een nieuwe partial Setup class aangemaakt waarin ik een read-only property Username toevoeg. Deze property kijkt of een username backing field leeg is, en zo ja haalt de username eventjes op uit de Service.Users lijste:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| // Mijn eigen partial class: public partial class Setup { private string _username; public string Username { get { if (_username == null) _username = Service.Users.FromId(this.UserId).Username; return _username; } } } // Automatisch gegenereert door webservice reference: [System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")] [System.Runtime.Serialization.DataContractAttribute(Name="Setup", Namespace="...")] [System.SerializableAttribute()] public partial class Setup : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged { { [System.Runtime.Serialization.DataMemberAttribute()] public int UserId { get { return this.UserIdField; } set { if ((this.UserIdField.Equals(value) != true)) { this.UserIdField = value; this.RaisePropertyChanged("UserId"); } } } } |
Waar het dus om gaat is dat ik in een partial class een property Username toevoeg, welke de username ophaalt (vanuit het UserId wat bekend is).
Mijn probleem is nu dat de UserId property kan veranderen. De verandering van UserId wordt netjes aan mijn views doorgegeven omdat die property RaisePropertyChanged aanroept. Maar de Username wordt niet opnieuw opgehaald uiteraard, omdat er niet doorgegeven wordt dat die ook moet veranderen. Resultaat is dat de Username niet veranderd (in mijn views) als ik de user verander.
Hoe zorg ik er nu voor dat RaisePropertyChanged ook voor de Username property aangeroepen wordt? Ik kan niet in de UserId property gaan zitten schrijven want die is autogenerated.
De enige optie die ik zie is de Setup class naar zijn eigen PropertyChanged event te laten luisteren, en als UserId veranderd dan nog even RaisePropertyChanged oproepen voor Username. Maar dat lijkt heel erg omslachtig, en ook een beetje vreemd. Er moet toch wel een mooiere manier zijn om dit op te lossen?