Допустимо ли «заимствовать» свойства зависимостей у не связанных классов? - PullRequest
4 голосов
/ 22 октября 2008

Я пишу класс, который отображает некоторый контент в WPF, и я хочу дать пользователю контроль над тем, как контент отображается. Рендеринг состоит в основном из штриховых линий, поэтому я решил обратиться к классу System.Windows.Forms.Shapes.Line, чтобы получить представление о том, какие свойства я мог бы реализовать. Это заставило меня реализовать большинство свойств StrokeXXXX, и это очень сложная работа, поскольку для каждого требуется метаданные, влияющие на рендеринг.

Коллега предложил мне просто «позаимствовать» свойства у Shape следующим образом:

Shape.StrokeThicknessProperty.AddOwner(typeof(MyType));

Это кажется довольно хорошей идеей. Я думал, что, делая это, я потеряю способность устанавливать обратные вызовы приведения и свойства, измененные, но похоже, перегрузка, которая принимает PropertyMetadata, позволяет это. Единственный недостаток, который я вижу, - если реализация Shape изменится, это повлияет на наш класс, но я не уверен, как часто я ожидаю значительного изменения интерфейсов .NET.

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

Ответы [ 2 ]

4 голосов
/ 23 октября 2008

Очень безопасно и полезно заимствовать ДП ... Прочитайте пост , следующий за доктором WPF по этому вопросу!

Вот несколько «советов», которые он дает:

  • Вы всегда должны знать, что делает класс владельца с любым заимствованным вами имуществом.
  • Следует обратить внимание на значения по умолчанию и наследование. Иногда вам нужно свойство bool со значением по умолчанию true ... в других случаях вам может потребоваться значение по умолчанию false. Иногда вам нужно свойство, которое наследует ... в других случаях вы явно не хотите наследования. (Заимствование свойства, такого как TextElement.FontSize, может действительно испортить вещи в дереве.)
  • Класс владельца может иногда определять PropertyChangedCallback, который будет мешать вашей способности использовать свойство по вашему желанию. Всегда знать, что класс владельца делает со свойством.
  • Класс владельца может предоставить процедуру проверки свойства, которая не позволяет вводить значение, которое вы хотите указать. Опять же, всегда знайте, что класс владельца делает со свойством. Свойство может быть зарегистрировано таким способом, который делает его дорогостоящим, например FixedPage.Bottom, который лишает законной силы родительское расположение каждый раз, когда свойство изменяется на объекте. Иногда вы можете явно хотеть это поведение ... в других случаях это просто излишне вызовет проходы макета. Опять же, всегда знайте, что класс владельца делает со свойством.
  • Если вы используете свойство в сценарии, в котором сама структура пытается использовать это свойство (например, TextSearch.TextPath для ItemsControl), вы можете оказаться в конфликте с этой платформой.
1 голос
/ 24 октября 2008

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

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