Вы создаёте custom control неправильно. Проще всего в Visual Studio пойти через Add → New Item → WPF → Custom Control, при этом произойдёт следующее (вы можете сделать то же самое вручную):
Создастся класс такого вот вида:
public class TestClass : Control
{
static TestClass()
{
// объявляем, что у нашего класса может быть собственный стиль,
// а не тупо наследуем стиль родительского объекта
DefaultStyleKeyProperty.OverrideMetadata(
typeof(TestClass), new FrameworkPropertyMetadata(typeof(TestClass)));
}
}
Вам нужно будет поменять Control на RadioButton.
Создастся в корне проекта каталог Themes, и в нём файл Generic.xaml (название важно!), в котором будет расположен стиль и шаблон для вашего контрола. Он будет выглядеть как-то так:
<Style TargetType="{x:Type local:TestClass}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TestClass}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Вам нужно будет положить туда ваш стиль.
Почему текущий код не работает? DataTemplate используется не для визуальных элементов, а для отображения невизуальных данных, таких как строка или VM-объект. Если вы не наследуетесь от UI-класса, ваш объект расценивается как объект невизуального класса, и для него работает DataTemplate. Но это неправильно, т. к. вы-то хотите создать UI-элемент!
А когда вы наследуетесь от RadioButton, то ваш объект становится UI-объектом, и для его отображения используется стиль по умолчанию. Поскольку вы такой стиль не определили, используется, как вы сами заметили, стиль родительского объекта.
На самом деле, использование custom control'а — довольно редкая штука. Если вам нужно просто отобразить данные, вы идёте слишком сложным путём: вам не нужно наследоваться от RadioButton'а, а просто использовать его в шаблоне и привязаться к данным через Binding.
На форме есть N-е количество RadioButton'ов (и по мере выполнения программы они могут добавляться пользователем) и если какой-то из них выбирается, то нужно отобразить информацию из его свойств на отдельной панели в определенном виде. К примеру, если выбрана одна радиокнопка, то на панели отображаются 2 textbox'a, если другая, то 3 кнопки и т.д. Таких вариантов достаточно много. Поэтому я наследую от RadioButton, т.к. мне нужно хранить дополнительную информацию в свойствах.
Подскажите, как такое лучше сделать?
– trydex Nov 04 '16 at 11:09SelectedVM. – VladD Nov 04 '16 at 12:48