2009-09-15 11 views
6

Ho il seguente ComboBox elemento XAML:Come implementare un controllo Button Radio XAML con un'origine ObservableCollection?

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

Vorrei implementare RadioButtons nello stesso modo, in questo modo:

pseudo-codice:

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

Tuttavia, l'unico WPF Rad Le implementazioni ioButton che posso trovare sono statico come questo.

<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> 

Come si crea un controllo RadioButton che non è statico come sopra, ma invece ottiene i suoi dati dalla sua proprietà ItemsSource come nell'esempio ComboBox sopra?

risposta

5

Usa ItemsControl e DataTemplate:

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

non Avete bisogno di avvolgere il all'interno di un ? Almeno il DataContext si riferiva ancora al DataContext del genitore invece del tipo di oggetto. Vedere: http://stackoverflow.com/q/1511516/134761 – angularsen

+0

@angularsen corretto! –

1

codice nel file di 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> 

questa linea

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

è utilizzando la voce fonte proprietà

C# codice

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

public partial class Window1 : Window 

{ 
    public Window1() 

    { 

     InitializeComponent(); 

    } 

} 

} 

Credo che questo vi aiuterà fuori ..

+0

Probabilmente dovresti usare 'ItemsControl' piuttosto che' ListBox', poiché la funzionalità di selezione di quest'ultimo non è richiesta. –

Problemi correlati