2016-12-07 14 views
1

У меня есть следующий класс для привязки к динамически созданным столбцам в WPF DataGrid. Колонка связывания должен быть имя свойства, и я могу добавить соответствующим образом названные свойства к DynamicObject:Почему TryGetMember не вызывается в моем 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; 
    } 
} 

Просто FYI, каждый день собственности хранит AppointmentRowViewModel.

Когда я заполнил экземпляр вышеуказанного с одним динамическим свойством для каждого дня недели, перечислены все динамические свойства, и доступ к словарю работает нормально, но доступ к имени свойства вызывает исключение. Например, (из моего окна немедленного):

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} 

Возможно, это потому, что я только задал свойства, используя доступ к словарю? Я не знаю, как еще без имени собственности литералов, так что я делаю это так:

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) используется метод, DateTime расширения, чтобы получить дату первого же день недели, что ActiveDate происходит, в зависимости от того, на какой неделе начинается.

Я думал, что основная идея DynamicObject заключалась в том, чтобы иметь доступ к элементу словаря, используя его ключ, как если бы это было имя свойства. Почему это не работает для меня?

ответ

3

Я не могу добавлять комментарии из-за моей низкой репутации, поэтому я оставлю ответ.

из вашего образца кода при условии, что я могу видеть только так, как вы сохраняете динамический объект как

BindableDynamicDictionary apptDynamic = Appointments[start]; 

для доступа к динамическому собственности для работы необходимо использовать динамические ключевые слова

dynamic apptDynamic = Appointments[start]; 

ссылки ссылки

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

Differences between ExpandoObject, DynamicObject and dynamic

 Смежные вопросы

  • Нет связанных вопросов^_^