Можно ли сломать LSP ради связывания? - PullRequest
0 голосов
/ 07 октября 2011

Что-то подсказывает мне, что я могу получить линчевание за этот вопрос. И извините за длинное подробное описание заранее.

Я работаю над чем-то вроде углового футляра в проекте Silverlight 4. По сути, то, что я создаю, - это создатель пользовательских форм.

Форма может иметь несколько полей, которые могут быть разных типов (текст, целое число, адрес электронной почты и т. Д.). Теперь все эти типы расширяют класс Field, но могут иметь дополнительные свойства, такие как длина, в случае текстового поля.

У меня есть возможность добавлять и удалять поля из коллекции FieldViewModels в моем FormFieldsManagementViewModel. Пока что все это довольно стандартные вещи.

Теперь, ... Для того чтобы пользователь мог установить свойства для объектов поля, у меня есть UserControl, который имеет свойства зависимости типа DataTemplate и который представляет пользовательский интерфейс, который я хочу отображать, когда поле определенного типа выбран. Итак, чтобы уточнить, UserControl имеет свойство SingleLineTextTemplate, которое будет отображаться при выборе SingleLineTextFieldViewModel, но при выборе EmailFieldViewModel отображается EmailFieldTemplate. И SingleLineTextFieldViewModel, и EmailFieldViewModel наследуются от FieldViewModel.

Моя проблема возникает, когда я объявляю привязки в каждом из этих шаблонов. Вполне допустимо (IMHO) устанавливать свойства базового класса FieldViewModel, такие как IsRequired и Position, но у меня также есть привязки для Length в SingleLineTextTemplate, которые соответствуют свойству Length SingleLineTextFieldViewModel. Поэтому я полагаюсь на расширенный интерфейс конкретного класса, а не только на класс FieldViewModel.

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

Я делаю это только для привязки и отсутствия привязки к динамическим объектам и / или отсутствия DataTemplateSelector в Silverlight.

Очевидно, что SingleLineTextFieldViewModel не может заменить его базовый класс в сценарии связывания. У меня такой вопрос, так как я на самом деле не использую эти объекты в коде, но в разметке, .. Это все еще считается плохой практикой?

Большое спасибо заранее.

1 Ответ

1 голос
/ 07 октября 2011

У меня не было бы никаких проблем с этим - я делал то же самое или подобное в прошлом.

Предполагая, что вы используете SingleLineTextTemplate, только когда DataContext является экземпляром SingleLineTextFieldViewModel (предположительно, путем сопоставления DataTemplate с типом), тогда проблем никогда не будет, и из-за упругой природы рамки связывания у вас не будет никаких существенных негативных последствий, даже если вы попытаетесь использовать шаблон для неподходящего типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...