Да. Система привязки WPF будет использовать пользовательский дескриптор типа для взаимодействия со свойствами вашей ViewModel во время выполнения. Я использовал это раньше, чтобы ключи KeyValueCollection отображались как свойства в коллекции.
Это имеет два важных преимущества. Упрощает связывание:
DataContext.SomeCollectionProperty[SomeKey]
можно упростить до DataContext.SomeCollectionProperty.SomeKey
и, если вы создадите дескриптор пользовательского типа для контекста данных, DataContext.SomeKey
, что примерно так же просто, как и получается.
И это исправляет то, что я считаю ошибкой - строки формата отображаются даже при нулевом свойстве. Используя CTD, вы можете пропустить нулевые (и DBNull) свойства, гарантируя, что строки формата не будут отображаться, если свойство не существует:
Представьте, что у вас есть double?
, который вы должны отобразить как сумму в долларах. Если вы используете следующую привязку: {Binding Price, FormatString='Price: {0:c}'}
и цена равна нулю, вы получите следующее в вашем пользовательском интерфейсе: Price: $
. Это безобразно Однако, если Price
является свойством на основе PropertyDescriptor в вашем пользовательском интерфейсе, когда цена равна нулю, вы можете не сообщать об этом свойстве через CTD. Это предотвращает отображение строки формата вообще.
Вот очень хорошая ссылка на MSDN о , украшающем ваши типы CTD .