2016-12-07 2 views
1

J'ai la classe suivante pour la liaison aux colonnes générées dynamiquement sur un WPF DataGrid. La colonne de liaison doit être un nom de propriété, et je peux ajouter des propriétés à un nom approprié DynamicObject:Pourquoi TryGetMember n'est pas appelé sur mon DynamicObject?

public class BindableDynamicDictionary : DynamicObject 
{ 
    private readonly Dictionary<string, object> _dictionary; 

    public BindableDynamicDictionary() 
    { 
     _dictionary = new Dictionary<string, object>(); 
    } 

    public object this[string key] 
    { 
     get { return _dictionary[key]; } 
     set { _dictionary[key] = value; } 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     return _dictionary.TryGetValue(binder.Name, out result); 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     _dictionary[binder.Name] = value; 
     return true; 
    } 
} 

Juste propriété Pour votre information, chaque jour stocke une AppointmentRowViewModel.

Lorsque j'ai rempli une instance de ce qui précède avec une propriété dynamique pour chaque jour d'une semaine, toutes les propriétés dynamiques sont répertoriées et l'accès au dictionnaire fonctionne correctement, mais l'accès au nom de propriété génère une exception. E.g (de ma fenêtre Immédiate):

apptDynamic.GetDynamicMemberNames() 
Count = 9 
    [0]: "20161205" 
    [1]: "Monday" 
    [2]: "20161206" 
    [3]: "Tuesday" 
    [4]: "20161208" 
    [5]: "Thursday" 
    [6]: "20161211" 
    [7]: "Sunday" 
    [8]: "20161215" 
apptDynamic.Monday 
error CS1061: 'AppointmentCalendarViewModel.TimeAppointmentDictionary' does not contain a definition for 'Monday' and no extension method 'Monday' accepting a first argument of type 'AppointmentCalendarViewModel.TimeAppointmentDictionary' could be found (are you missing a using directive or an assembly reference?) 
apptDynamic["Monday"] 
{ApptEase.Client.Prism.CSharp.ViewModels.AppointmentRowViewModel} 

Est-ce peut-être parce que je définis uniquement les propriétés en utilisant l'accès au dictionnaire? Je ne sais pas comment le sans littérales nom de la propriété, donc je le fais comme ceci:

BindableDynamicDictionary apptDynamic = Appointments[start]; 
DateTime loopDate = ActiveDate.FirstDayOfWeek(WeekStartDay); 
for (var i = 0; i < DaysVisible; i++) 
{ 
    loopDate = loopDate.AddDays(i); 
    if (appt.StartDateTime.Date == loopDate.Date) 
    { 
     apptDynamic[loopDate.ToString("yyyyMMdd")] = appt; 
     apptDynamic[loopDate.DayOfWeek.ToString()] = appt; 
     continue; 
    } 
    apptDynamic[loopDate.ToString("yyyyMMdd")] = null; 
    apptDynamic[loopDate.DayOfWeek.ToString()] = null; 
} 

ActiveDate.FirstDayOfWeek(WeekStartDay) utilise une méthode d'extension DateTime pour obtenir la date du premier jour de la semaine que ActiveDate se produit dans, en fonction de laquelle la semaine commence.

Je pensais qu'une partie de l'idée principale de DynamicObject était de pouvoir accéder à un élément de dictionnaire en utilisant sa clé comme s'il s'agissait d'un nom de propriété. Pourquoi est-ce que ça ne marche pas pour moi?

Répondre

3

Je ne peux pas ajouter de commentaires en raison de ma faible rep, donc je vais laisser une réponse.

de votre exemple de code à condition que je ne peux voir la façon dont vous stockez l'objet dynamique

BindableDynamicDictionary apptDynamic = Appointments[start]; 

pour l'accès à la propriété dynamique fonctionne, vous devez utiliser le mot-clé dynamique

dynamic apptDynamic = Appointments[start]; 

liens de référence

https://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetmember(v=vs.110).aspx

Differences between ExpandoObject, DynamicObject and dynamic