Я не могу попробовать это в данный момент, так что это может быть неточным или даже невозможным. Как только я доберусь до компьютера, на котором я смогу попробовать это, я ... до тех пор, , это всего лишь теория.
Я предполагаю, что в вашем составном элементе управления у вас будет что-то вроде этого для каждого поля данных:
<TextBlock Text="{Binding FirstName, Mode=OneWay}" />
<TextBox Text="{Binding FirstName, Mode=TwoWay, ...}" />
Что вам, вероятно, понадобится сделать, чтобы создать конвертер, который будет проверять данные привязки для атрибута Display
и вместо этого преобразовывать значение в значение атрибута. Это приведет к тому, что приведенный выше блок будет выглядеть так:
<TextBlock Text="{Binding FirstName, Mode=OneWay, Converter={StaticResource AttributeConverter}, ConverterParameter=Display}" />
<TextBox Text="{Binding FirstName, Mode=TwoWay, ...}" />
Здесь я передал Display
в качестве параметра на тот случай, если вы хотите получить доступ к другому атрибуту.
Опять же, это просто теория, поскольку я не могу проверить это и не могу вспомнить, пропустит ли IValueConverter.Convert(object value, ...)
рассматриваемый объект или только строковое значение в этом случае. Если это просто строковое значение, это, вероятно, невозможно, хотя, если это вместо этого объект, это будет зависеть от того, насколько у вас есть доступ к пространству имен отражения для оценки атрибутов.
Как только я смогу, я скину сценарий и попробую его.
EDIT:
По какой-то причине подсветка синтаксиса дает мне палец, когда я пытаюсь вставить код в этом редактировании
В любом случае, попробовав это в небольшом проекте, он не думает, что вы сможете это сделать.
Основываясь на моем предложении сделать 2 элемента управления с привязкой к данным и использовать конвертер для того, который использует атрибут, я сделал следующее:
- Создан xaml для элемента управления с привязкой к данным.
- Создание пользовательского атрибута для тестирования
- Создана модель с оформленным свойством для тестирования.
- Создан конвертер для попытки чтения атрибута из свойства.
Вот здесь я и попался. Мне не удалось получить связанный тип данных из метода IValueConverter.Convert (...). Параметр value был представлен как String, как и параметр targetType. Хотя это и было основным зависанием, во-вторых, я не смог динамически определить имя свойства, к которому привязан элемент управления. Возможно, это можно исправить с помощью параметра преобразователя.
Теперь я был в состоянии прочитать значение атрибута, если я предоставил тип моей тестовой модели с декорированным свойством, чтобы было возможно многое, но я не смог динамически определить тип на лету.
Единственный другой способ, который я могу придумать, - это создать некоторую форму наблюдателя или преобразователя до того, как данные действительно будут связаны с вашим пользовательским элементом управления.
Удачи