如何获取MVVM绑定的radiobuttons的选定索引?

时间:2009-08-19 14:37:41

标签: c# .net wpf data-binding mvvm

我有一个ItemsControl,它绑定并设置为我的viewmodel中的observablecollection:

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

现在,如何找出点击哪一个?我想将每个Radiobutton的IsChecked值绑定到viewmodel中的单个变量,该变量返回集合的索引。这将使我很容易直接引用所选项目。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

这就是我解决这个问题的方法。我为此写了一个EnumToBool转换器,比如

  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 

    }  

我有以下枚举

 public enum CompanyTypes
    {
        Type1Comp,
        Type2Comp,
        Type3Comp
    }

现在,在我的Xaml中,我将类型作为转换器参数传递。

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

现在,在您的视图模型中,您应该拥有一个属性(在本例中为Type),该属性是Enum类型。

喜欢,

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

            }
        }

在此示例中,您可能已经注意到Radiobuttons是静态的。在您的情况下,当您在Item控件中列出单选按钮时,您需要将RadioButton的ConverterParameter绑定到正确的类型。

答案 1 :(得分:0)

最后,我将单选按钮放入列表视图中,并将listview的isselected属性绑定到radiobutton属性。

link Forum post describing this technique

答案 2 :(得分:0)

当使用带有radiobutton控件的MVVM时,在onToggle()方法上会出现问题,但您可以为此创建一个单选按钮。

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

        }

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

然后添加对control和Binding属性的引用,在我的例子中是IsActive。

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