2009-09-15 6 views
6

je le suivant ComboBox élément en XAML:Comment implémenter un contrôle de bouton radio XAML avec une source ObservableCollection?

<ComboBox ItemsSource="{Binding CollectionControlValues}" 
    SelectedItem="{Binding CollectionControlSelectedValue, UpdateSourceTrigger=PropertyChanged}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Value}" /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

je voudrais mettre en œuvre RadioButtons dans la même, comme ceci:

PSEUDO-CODE:

<RadioButtons ItemsSource="{Binding CollectionControlValues}" 
    SelectedItem="{Binding CollectionControlSelectedValue, UpdateSourceTrigger=PropertyChanged}"> 
    <RadioButtons .ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Value}" /> 
     </DataTemplate> 
    </RadioButtons .ItemTemplate> 
</RadioButtons > 

Cependant, le seul WPF Rad Implémentations ioButton que je peux trouver sont statique comme ça.

<StackPanel x:Name="rbHolder1" Style="{StaticResource rbStackPanelStyle}"> 
    <RadioButton Style="{StaticResource rbStyle}">RadioButton 1</RadioButton> 
    <RadioButton Style="{StaticResource rbStyle}">RadioButton 2</RadioButton> 
    <RadioButton Style="{StaticResource rbStyle}">RadioButton 3</RadioButton> 
    <RadioButton Style="{StaticResource rbStyle}">...</RadioButton> 
</StackPanel> 

Comment puis-je créer un contrôle RadioButton qui n'est pas statique comme ci-dessus, mais obtient ses données au lieu de sa propriété ItemsSource comme dans l'exemple ci-dessus ComboBox?

Répondre

5

Utilisez ItemsControl et DataTemplate:

<ItemsControl ItemsSource="{Binding CollectionControlValues}"> 
    <DataTemplate> 
    <RadioButton Content="{Binding Value} IsChecked={Binding SomeProperty}" GroupName="name"/> 
    </DataTemplate> 
</ItemsControl> 
+1

Ne vous devez envelopper la dans un ? Au moins, le DataContext faisait toujours référence au DataContext du parent au lieu du type d'élément. Voir: http://stackoverflow.com/q/1511516/134761 – angularsen

+0

@angularsen correct! –

1
Code

dans le fichier Window1.xaml

<Window x="RadioButton.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:local ="clr-namespace:RadioButton" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
<StackPanel> 
    <StackPanel.Resources> 
     <ObjectDataProvider x:Key="RadioOptions" MethodName="GetValues" ObjectType="{x:Type sys:Enum}"> 
      <ObjectDataProvider.MethodParameters> 
       <x:Type TypeName="local:RadioOption" /> 
      </ObjectDataProvider.MethodParameters> 
     </ObjectDataProvider> 
     <Style x:Key="RadioButtonList" TargetType="{x:Type ListBox}"> 

      <Setter Property="BorderBrush" Value="{x:Null}" /> 

      <Setter Property="BorderThickness" Value="0" /> 

      <Setter Property="ItemContainerStyle"> 

       <Setter.Value> 

        <Style TargetType="{x:Type ListBoxItem}" > 

         <Setter Property="Margin" Value="2" /> 

         <Setter Property="Template"> 

          <Setter.Value> 

           <ControlTemplate TargetType="{x:Type ListBoxItem}"> 

            <Border Background="Transparent"> 

             <RadioButton Focusable="False" 

        IsHitTestVisible="False" 

        IsChecked="{TemplateBinding IsSelected}"> 

              <ContentPresenter /> 

             </RadioButton> 

            </Border> 

           </ControlTemplate> 

          </Setter.Value> 

         </Setter> 

        </Style> 

       </Setter.Value> 

      </Setter> 

     </Style> 
    </StackPanel.Resources> 
    <ListBox Margin="37,20,28,58" Name="listBox1" Style="{StaticResource RadioButtonList}" ItemsSource="{Binding Source={StaticResource RadioOptions}}" /> 
</StackPanel> 

cette ligne

<ListBox` Margin="37,20,28,58" Name="listBox1" Style="{StaticResource RadioButtonList}" 
ItemsSource="{Binding Source={StaticResource RadioOptions}}" 

est en utilisant l'article Source, propriété

code C#

namespace RadioButton 
{ 
    public enum RadioOption 
    { 
    option1, 
    option2, 
    option3, 
    option4 
    } 

public partial class Window1 : Window 

{ 
    public Window1() 

    { 

     InitializeComponent(); 

    } 

} 

} 

je pense que cela va vous aider ..

+0

Vous devriez probablement utiliser 'ItemsControl' plutôt que' ListBox', car la fonctionnalité de sélection de ce dernier n'est pas requise. –

Questions connexes