2009-08-19 1 views
0

Ich habe ein Itemscontrol, die in meinem Viewmodel an eine ObservableCollection gebunden ist und eingestellt:Wie bekomme ich den ausgewählten Index von MVVM-gebundenen Radiobuttons?

<ItemsControl ItemsSource="{Binding AwaySelection}" > 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <RadioButton Content="{Binding AwayText}" ></RadioButton> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

Nun, wie Welche geklickt wird, um herauszufinden? Ich möchte den IsChecked-Wert jedes Radiobutton an eine einzelne Variable im Viewmodel binden, die einen Index an die Sammlung zurückgibt. Dies würde es mir sehr leicht machen, den ausgewählten Gegenstand direkt zu referenzieren. Irgendwelche Ideen?

Antwort

1

So habe ich dieses Problem gelöst. Ich schrieb einen EnumToBool Konverter für diese, wie

public class EnumToBoolConverter : IValueConverter 
    { 
     #region IValueConverter Members 

     public object Convert(object value, 
      Type targetType, object parameter, 
      System.Globalization.CultureInfo culture) 
     { 
      if (parameter.Equals(value)) 
       return true; 
      else 
       return false; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return parameter; 

     } 
     #endregion 

    } 

Und ich habe die folgende Aufzählung

public enum CompanyTypes 
    { 
     Type1Comp, 
     Type2Comp, 
     Type3Comp 
    } 

nun in meiner XAML, ich bin die Art, wie der Konverter Parameter.

<Window x:Class="WpfTestRadioButtons.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfTestRadioButtons" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <local:EnumToBoolConverter x:Key="EBConverter"/> 
    </Window.Resources> 
    <Grid> 
     <StackPanel> 
      <RadioButton IsChecked="{Binding Path=Type, 
       Converter={StaticResource EBConverter}, 
       ConverterParameter={x:Static local:CompanyTypes.Type1Comp}}" Content="Type1"/> 
      <RadioButton IsChecked="{Binding Path=Type, 
       Converter={StaticResource EBConverter}, 
       ConverterParameter={x:Static local:CompanyTypes.Type2Comp}}" Content="Type2"/> 
     </StackPanel> 

    </Grid> 
</Window> 

nun Ihrer Meinung nach Modell, sollten Sie eine Eigenschaft haben (in diesem Fall Typ), die dieser Enum-Typ ist.

Wie,

public CompanyTypes Type 
     { 
      get 
      { 
       return _type; 
      } 
      set 
      { 
       _type = value; 
       if (PropertyChanged != null) 
        PropertyChanged(this, new PropertyChangedEventArgs("Type")); 

      } 
     } 

In diesem Beispiel haben Sie vielleicht bemerkt, dass Radiobuttons statisch sind. In Ihrem Fall, wenn Sie die Optionsschaltflächen in einem Elementsteuerelement auflisten, müssen Sie auch den ConverterParameter Ihres RadioButton an den richtigen Typ binden.

0

Bei Verwendung MVVM mit Radiobutton-Steuerelement ein Problem auf Verfahren onToggle() beendet, aber Sie können einen Radiobutton dafür erstellen.

public class DataBounRadioButton: RadioButton 
    { 
     protected override void OnChecked(System.Windows.RoutedEventArgs e) { 

     } 

     protected override void OnToggle() 
     { 
      this.IsChecked = true; 
     } 
    } 

Dann Verweis hinzufügen, um eine Eigenschaft zu steuern und zu binden, in meinem Fall IsActive.

<controls:DataBounRadioButton 
         IsChecked="{Binding IsActive}"/>