У меня есть следующий класс для привязки к динамически созданным столбцам в 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
заключалась в том, чтобы иметь доступ к элементу словаря, используя его ключ, как если бы это было имя свойства. Почему это не работает для меня?