Простое свойство WPF против сложного свойства - PullRequest
0 голосов
/ 16 июля 2010

В WPF лучше создать свойство complex (например, типа «Visibility») или свойство simple (то есть типа boolean), а затем использовать конвертер для привязки свойства? Первый способ написать короче, но я не знаю, что лучше в выступлениях.

Ответы [ 3 ]

6 голосов
/ 16 июля 2010

Повышение производительности при использовании конвертера будет незначительным.Однако выбор следует основывать на том, где вы реализуете свойство.

Свойство Visibility имеет смысл только для класса на уровне пользовательского интерфейса (пользовательский элемент управления или, возможно, модель представления).Если вы создаете свойство для класса модели, который просто используется для управления вашим пользовательским интерфейсом в этом случае, было бы более целесообразно использовать логическое значение и преобразователь.

РЕДАКТИРОВАТЬ: добавлен (слегка надуманный) пример

Например, представьте, что у вас есть класс данных (модель) для редактируемого объекта с именем Foo, и Foo может быть "простым" или«расширенный».«Расширенный» Foo отобразит дополнительные элементы редактирования в пользовательском интерфейсе, поэтому нам нужно привязать свойство Visibility панели расширенного редактирования к некоторому свойству.

Ваш класс Foo может иметь свойствочтобы указать, продвинутый он или нет.Это свойство должно определенно быть логическим - НЕ Visibility - потому что ваш класс Foo не должен заботиться о каких-либо особенностях пользовательского интерфейса, который его отображает.Таким образом, логическое Foo.IsAdvanced будет подходящим свойством.

В этом случае вы можете напрямую связать с Foo.IsAdvanced и использовать конвертер.То, что вы определенно не хотите сделать, - это создать Visibility свойство Foo.AdvancedEditControlVisibility, поскольку Foo должен быть внутренним классом данных.

Если вы хотитеСоздайте свойство, которое не требует конвертера, вы должны создать это свойство в более высоком классе, специфичном для вашего пользовательского интерфейса.Некоторые архитектурные паттерны называют этот класс «ViewModel» - это класс, который представляет модель таким образом, чтобы данные лучше подходили для отображения в пользовательском интерфейсе.Таким образом, вы можете создать класс, который принимает Foo и предоставляет свойство AdvancedEditControlVisibility, которое основано на значении его Foo.IsAdvanced.

В этом случае вы можетепривязка непосредственно к свойству на модели представления без конвертера.Обратите внимание, что в конечном итоге вы все равно сделали преобразование - вы просто сделали его более явной частью своего кода, вместо того, чтобы ограничиваться разметкой.

Мысленный процесс заключается в том, что модель представления является "более высокой"level "class - класс, который оборачивает ваш класс данных и включает в себя логику, специфичную для пользовательского интерфейса, и поэтому более уместно включать код, специфичный для вашего пользовательского интерфейса.В идеале вы должны взять каждый класс вашего проекта по очереди и убедиться, что он имеет определенную цель: если Foo является бизнес-объектом, который содержит данные, почему он должен предоставлять (или даже заботиться о!) Видимость некоторыхчасть интерфейса используется для его отображения?Что произойдет, если вы добавите Foo в приложение командной строки или веб-приложение?Если в бизнес-классе у вас есть специфичная для WPF-UI логика, значит, ваша инкапсуляция неправильная, но иногда такое разделение проблем - одна из самых сложных вещей, которую нужно исправить.

И с точки зрения производительности вызаметить небольшую разницу: -)

2 голосов
/ 16 июля 2010

Если вопрос касается производительности, первый вариант будет иметь незначительную скорость по сравнению со вторым, поскольку последний включает в себя упаковку / распаковку.

Но рекомендуется иметь свойства, ориентированные на данные, и изменитьсоответственно, используйте converters или DataTriggers.

1 голос
/ 16 июля 2010

Я не думаю, что какой-либо из этих двух вариантов будет иметь серьезную проблему с производительностью. Более важно, кто будет конечным пользователем собственности.

В моем проекте мы отображаем эти типы свойств для пользователя в сетке свойств; поэтому имеет смысл иметь логическое свойство, чтобы оно отображалось для пользователя как флажок.

Если мы выберем свойство Visibility, оно будет отображаться в виде комбинированного списка, имеющего параметры Видимый, Скрытый и Свернутый. Это может быть путаницей для не технических пользователей.

Как сказал Дэн, - если ваше свойство объявлено в слое viewmodel / presentation и только вы будете использовать это свойство в представлениях (xaml или код), то имеет больше смысла иметь сложное свойство. Так что вы можете напрямую связать это. Но если вы делаете это где-то еще, скажем, ваш BL, то имеет смысл иметь его как bool.

...