2010-01-27 4 views
1

В системе, в которой я работаю, используется большое количество пользовательских типов значений внутри. Я работаю над прототипом пользовательского интерфейса, используя WPF. WPF не знает, как отображать пользовательские типы. Я знаю, что могу написать собственный ValueConverter для этого, но я действительно не хочу указывать использование конвертера каждый раз, когда я привязываюсь к классу в своем XAML.Отображение пользовательского типа значений в WPF без использования преобразователя значений

Есть ли интерфейс, который я могу реализовать в пользовательском типе значений, который позволит WPF знать, как отображать его изначально?

Или есть способ, которым я могу указать конвертер значений на уровне приложения, который будет применяться к любому экземпляру нашего пользовательского типа, без необходимости указывать ValueConveter в каждом обязательном выражении?

ответ

1

Aha! Догадаться. Мне нужно было написать TypeConverter и применить его к моим пользовательским типам. Это позволяет WPF автоматически определять, как обращаться с ними, не указывая шаблон или конвертер в XAML.

http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx

+0

** Это плохая идея и плохое решение проблемы. ** Вместо этого вы должны использовать по умолчанию 'DataTemplate' в своих' App.xaml' или 'Themes/Generic.xaml'. Templating - это то, что делает WPF мощным: один и тот же объект может выглядеть по-разному в разных частях вашего приложения или в другом приложении, и вы получаете четкое разделение между вашим уровнем данных и вашим пользовательским интерфейсом. Основополагающим принципом хорошего дизайна WPF является то, что ваш уровень данных не должен ничего знать о пользовательском интерфейсе. Для этого есть много веских причин. Использование TypeConverter, который знает о пользовательском интерфейсе, серьезно нарушает этот принцип. –

+0

@ Ray Burns: решения идеально подходят для пользовательских типов значений - например, у меня есть пользовательские строковые, десятичные и логические типы, облегчающие преобразование и доступ к базе данных –

1

Вы должны указать DataTemplate для своего типа значения и поместить его в свои прикладные ресурсы. Это определит, как отображается тип вашего значения по всему миру.

0

Прошу прощения, если это настолько очевидно, что это глупо, но почему бы вам не переопределить ToString() в своих типах значений?

+0

Я сделал. Это не работает, по крайней мере, для случая, с которым я имею дело, что является обязательным для DataGrid. – Jason