Использование полиморфизма в (Поверхность) UserControl? - PullRequest
0 голосов
/ 18 января 2011

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

Но как мне определить абстрактный суперкласс для (Surface) UserControl? Я попытался просто создать подкласс для файла code-behind для SurfaceUserControl, но затем я получил следующую ошибку:

Partial declarations of 'Prototype_Concept_2.views.DependencyExpander' must not specify different base classes  C:\Users\Roflcoptr\Documents\Visual Studio 2008\Projects\Prototype_Concept_2\Prototype_Concept_2\views\DependencyExpander.xaml.cs

Ответы [ 3 ]

1 голос
/ 18 января 2011

Проблема в том, что ваш файл Xaml, вероятно, все еще начинается с:

<UserControl x:Class="..."

Однако, если вы производите свой класс от другого типа (не UserControl, а SurfaceUserControl), то выВы говорите, что один и тот же класс подклассов двух классов.

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

Вместо того, чтобы пытаться создать один суперкласс для UserControl, часто проще использовать инкапсуляцию для передачи ответственности одному классу.Каждый UserControl может обрабатывать общее поведение таким образом.В качестве альтернативы вы можете использовать общий DataContext (или общую иерархию).

1 голос
/ 19 января 2011

Получение из SurfaceUserControl (или SurfaceControl, или SurfaceContentControl, или SurfaceItemsControl, в зависимости от обстоятельств), безусловно, хорошая вещь, поскольку пользователям вашего элемента управления будет проще работать с событиями Surface на них.Вы правы, хотя это приводит к значительному дублированию кода.

Когда мы создавали Surface SDK, для смягчения этой проблемы использовалось много автоматической генерации кода.Если вы используете Reflector, чтобы посмотреть, как реализованы элементы управления Surface, вы увидите, что в сам элемент управления встроено очень мало логики - это несколько вспомогательных классов, которые содержат массу логики, которая используется каждым из отдельных элементов управления.

0 голосов
/ 18 января 2011

Базовый элемент управления, из которого вы получаете пользовательские элементы управления, необязательно должен быть SurfaceUserControl.Поэтому создайте шаблонный пользовательский элемент управления, который может быть получен из SurfaceContentControl, и поместите большую часть кода для совместного использования в этот базовый класс.

...