0

UserControl (ラジオボタンのグループ) に含まれる ItemsControl の ItemsSource プロパティを同じ UserControl のプロパティにバインドしようとしています。これは、UserControl が使用されている場合、DependencyProperty によって駆動される必要があります。しかし、代わりにコントロール名をハードコードすると、割り当てが正しく機能します。

これはクラスです:

public partial class GroupListBox : UserControl
{
    public GroupListBox()
    {
        InitializeComponent();
    }

    private List<RadioButton> _itemsList = new List<RadioButton>();
    public List<RadioButton> ItemsList
    {
        get { return _itemsList; }
        set
        {
            _itemsList = value;
        }
    }

    public IEnumerable ItemsSource
    {
        get { return (IEnumerable)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    public static readonly DependencyProperty ItemsSourceProperty = 
            DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(GroupListBox), new FrameworkPropertyMetadata(null, OnItemsSourceChanged));

    private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = (GroupListBox)d;
        var grpName = control.GetHashCode().ToString(); // used to generate a unique GroupName
        var oldValue = (IEnumerable)e.OldValue;
        var newValue = (IEnumerable)e.NewValue;

        if ((e.NewValue == null) && !BindingOperations.IsDataBound(d, ItemsSourceProperty))
        {
            control.ItemsList.Clear();
        }
        else
        {
            var radioItems = (from object item in newValue select new RadioButton() { Content = item, GroupName = grpName }).ToList();
            //control.container.ItemsSource = radioItems; // *** this works
            control.ItemsList = radioItems; // *** this doesn`t
        }
    }

これはXAMLです

<Border x:Name="brdMain">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <TextBlock x:Name="txtTitle" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="0" Text="" />
        <Image x:Name="imgImage" Grid.Column="0" Grid.Row="1" />
        <ScrollViewer x:Name="scroll" Grid.Row="1" Grid.Column="1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"  CanContentScroll="True">
            <!--This is the control I want to bind-->
            <ItemsControl x:Name="container"  ItemsSource="{Binding Path=ItemsList}" >
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </ScrollViewer>
    </Grid>
</Border>

次のように使用します。

<cust:GroupListBox ItemsSource="{Binding SymmetryAxis}"></cust:GroupListBox>

コントロールバインディングに何か問題があると確信していますが、何が原因かわかりません。どんな手掛かり?

編集: XAML に少し変更を加えました: 今では次のようになります:

<ItemsControl Name="container" Width="{Binding ElementName=scroll, Path=ViewportWidth}" ItemsSource="{Binding Path=ItemsSource, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:GroupListBox}}}" ItemTemplate="{StaticResource ItemPanelDatatemplate}" />

これは DataTemplate です:

<DataTemplate DataType="{x:Type ItemsPanelTemplate}" x:Key="ItemPanelDatatemplate">
    <RadioButton Content="{Binding}" GroupName="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ItemsControl}, Path=Name}"></RadioButton>    </DataTemplate>

いずれにせよ、GroupName は常に空であり、すべての RadioButton が単一のグループにあるかのように動作するため、GroupName に問題が生じます。

コードビハインドのように同じ結果を得るにはどうすればよいですか (たとえば、各グループに一意の名前を割り当てるには?

4

0 に答える 0