RadioButtonのカスタムコントロールにenumのリストをバインドしたい


WPFで、同じ`GroupName`を持つ`RadioButton`のリストを構成するカスタムコントロールを作ろうとしています。  
このカスタムコントロールは、次の`DependencyProperty`を持ちます。

`ItemsSource`：`enum`のコレクション（`enum`なら何でもOK）  
`SelectedValue`：選択されている`RadioButton`に対応する`enum`の値

`enum`の値から`RadioButton`の表示テキスト(`Content`)への変換は、`IValueConverter`を実装して適当に処理しています。  
`ItemsSource`から`RadioButton`を生成する処理には、`ItemsControl`を利用しました。

ここまでは問題なかったのですが、`SelectedValue`プロパティと、対応する`RadioButton`の`IsChecked`を結びつける方法が分かりません。  
`ItemsControl`を使わず、XAMLで静的に作られたものであれば、各`RadioButton`の`CoverterParameter`に対応する`enum`の値を記述し、`Converter`に渡すだけで良いことは分かるのですが、動的にラジオボタンを作ろうとして詰まってしまいました。  
下記のコードの、`ConvertParameter={Binding}`の部分が問題です。

[code]

    <ItemsControl Name="itemsControl" ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
    
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <RadioButton IsChecked="{
                                 Binding SeletedValue,
                                 Converter={StaticResource RadioButtonCheckedConverter},
                                 ConverterParameter={Binding},
                                 RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}
                             }"
                             GroupName="{Binding GroupName, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
                             Content="{Binding Converter={StaticResource RadioButtonTextConverter}}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    
    </ItemsControl>
    
[/code]

このままでは

[code]

    型 'Binding' の 'ConverterParameter' プロパティで 'Binding' を設定することはできません。
    'Binding' は、DependencyObject の DependencyProperty でのみ設定できます。
    
[/code]

というエラーが出てしまい、動作しません。  
何とかして、`RadioButtonCheckedConverter`に各`RadioButton`にバインドされている`enum`の値を`ConverterParameter`として渡したいのですが・・・  
どなたか何かご存知でしたら、教えてください。




添付プロパティを使用して`RadioButton`の`Checked`イベントを拾ってやる必要があると思います。  

[code]

    public class Radio
    {
        public static object GetSelectedValue(RadioButton obj)
        {
            return (object)obj.GetValue(SelectedValueProperty);
        }
    
        public static void SetSelectedValue(RadioButton obj, object value)
        {
            obj.SetValue(SelectedValueProperty, value);
        }
    
        public static readonly DependencyProperty SelectedValueProperty =
           DependencyProperty.RegisterAttached("SelectedValue", typeof(object), typeof(Radio), new FrameworkPropertyMetadata(null, OnSelectedValueChanged) { BindsTwoWayByDefault = true });
    
        private static void OnSelectedValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var rb = (RadioButton)d;
    
            rb.Checked -= rb_Checked;
            rb.Checked += rb_Checked;
            rb_Checked(rb, null);
        }
    
        static void rb_Checked(object sender, RoutedEventArgs e)
        {
            var rb = (RadioButton)sender;
            if (rb.IsChecked == true)
            {
                SetSelectedValue(rb, rb.DataContext);
            }
        }
    }
    
[/code]

使用例  

[code]

    <RadioButton local:Radio.SelectedValue="{Binding SelectedValue, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" />
    
[/code]




添付プロパティを使用して`RadioButton`の`Checked`イベントを拾ってやる必要があると思います。  

[code]

    public class Radio
    {
        public static object GetSelectedValue(RadioButton obj)
        {
            return (object)obj.GetValue(SelectedValueProperty);
        }
    
        public static void SetSelectedValue(RadioButton obj, object value)
        {
            obj.SetValue(SelectedValueProperty, value);
        }
    
        public static readonly DependencyProperty SelectedValueProperty =
           DependencyProperty.RegisterAttached("SelectedValue", typeof(object), typeof(Radio), new FrameworkPropertyMetadata(null, OnSelectedValueChanged) { BindsTwoWayByDefault = true });
    
        private static void OnSelectedValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var rb = (RadioButton)d;
    
            rb.Checked -= rb_Checked;
            rb.Checked += rb_Checked;
            rb_Checked(rb, null);
        }
    
        static void rb_Checked(object sender, RoutedEventArgs e)
        {
            var rb = (RadioButton)sender;
            if (rb.IsChecked == true)
            {
                SetSelectedValue(rb, rb.DataContext);
            }
        }
    }
    
[/code]

使用例  

[code]

    <RadioButton local:Radio.SelectedValue="{Binding SelectedValue, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" />
    
[/code]

