Как получить выбранный индекс MVVM-связанных радиокнопок? - PullRequest
0 голосов
/ 19 августа 2009

У меня есть ItemsControl, который привязан и установлен в наблюдаемую коллекцию в моей модели представления:

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

Теперь, как узнать, на какой из них нажали? Я хотел бы связать значение IsChecked каждого Radiobutton с одной переменной в viewmodel, которая возвращает индекс для коллекции. Это позволило бы мне напрямую ссылаться на выбранный элемент. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 19 августа 2009

Вот как я решил эту проблему. Для этого я написал конвертер 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"));

            }
        }

В этом примере вы могли заметить, что радиопереключатели статичны. В вашем случае, когда вы перечисляете переключатели внутри элемента управления Item, вам также необходимо привязать ваш ConverterParameter вашей RadioButton к правильному типу.

0 голосов
/ 20 августа 2009

При использовании 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}"/>
0 голосов
/ 20 августа 2009

В конце я помещаю переключатели в вид списка и связываю свойство isselected вида списка с радиокнопкой.

ссылка на форуме с описанием этой техники

...