次のようなコントロールを作成したい:
- ItemsControl から派生し、
- 列挙型のリストにバインドできます。
- 列挙型ごとに、RadioButton が表示されます。
- 特定の RadioButton が選択されると、SelectedItem には RadioButton に関連付けられた列挙値が含まれます。
上記のリストの最初の 3 点は達成できましたが、4 番目の項目に問題があります。アイテム コンテナ クラスの実装が間違っているか、generic.xaml のアイテム テンプレート定義が間違っている可能性があります。
アイテム コンテナは次のようになります。
public class MyEnumSelectorItem : ContentControl
{
public static readonly DependencyProperty IsSelectedProperty;
static MyEnumSelectorItem()
{
IsSelectedProperty = Selector.IsSelectedProperty.AddOwner(typeof(MyEnumSelectorItem));
}
public bool IsSelected
{
get { return (bool)GetValue(IsSelectedProperty); }
set { SetValue(IsSelectedProperty, value); }
}
static readonly DependencyProperty ModeProperty =
DependencyProperty.Register("Mode", typeof(MyEnum), typeof(MyEnumSelector), new PropertyMetadata());
public MyEnum Mode
{
get { return (MyEnum)GetValue(ModeProperty); }
set { SetValue(ModeProperty, value); }
}
}
アイテム コンテナ タイプは、メソッド オーバーライドSystem.Windows.Controls.Primitives.Selector
を使用してセレクタ コントロール ( から派生) に関連付けられます。IsItemItsOwnContainerOverride/GetContainerForItemOverride/PrepareContainerForItemOverride
generic.xaml の関連するフラグメントは次のようになります。
<Style TargetType="{x:Type controls:MyEnumSelector}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<RadioButton Content="{Binding}"
IsChecked="{Binding IsSelected, Mode=TwoWay}"
GroupName="enumSelector" Height="25" FontWeight="Bold" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
上記は、IsSelected プロパティの正しいバインドにより、自動的に SelectedItem プロパティが設定されることを前提としています (これは正しいと思いますよね?)。