2009-08-19 21 views
0

私は自分のviewmodelでのObservableCollectionにバインドして設定されているのItemsControlを持っている:MVVMバインドされたラジオボタンの選択されたインデックスを取得するには?

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

、クリックされた1を見つけるためにどのように?各ラジオボタンのIsChecked値をコレクションにインデックスを返すviewmodel内の単一の変数にバインドしたいと思います。これにより、選択したアイテムを直接参照できるようになります。何か案は?

答えて

1

これは私がこの問題を解決した方法です。私は

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 

    } 

のように、このためにEnumToBoolコンバータを書いて、私は今、私のXAMLで、私は、コンバータのパラメータとして型を渡している次の列挙

public enum CompanyTypes 
    { 
     Type1Comp, 
     Type2Comp, 
     Type3Comp 
    } 

をしました。

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

ここで、ビューモデルでは、Enum型のプロパティ(この場合は「タイプ」)が必要です。

と同様に、この例では

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

      } 
     } 

は、あなたはラジオボタンが静的であることに気づいたかもしれません。あなたのケースでは、Itemコントロールの中にラジオボタンをリストしているので、RadioButtonのConverterParameterも正しいタイプにバインドする必要があります。

0

RadioButtonコントロールで使用するMVVMは、法onToggle()上の問題は出ていますが、そのためのラジオボタンを作成することができます。

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

     } 

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

次に、コントロールへの参照を追加し、私の場合はIsActiveというプロパティをバインドします。

<controls:DataBounRadioButton 
         IsChecked="{Binding IsActive}"/> 
関連する問題