2010-12-04 13 views
10

Tengo una aplicación WPF-MVVM ...¿Cómo vincular la selección de botón de radio WPF a Viewmodel usando convertes?

Tengo 3 controles de botón de opción - con tres opciones => "Individual", "Grupo" y "Ambos". Todos los 3 tienen el mismo nombre de grupo ... eso significa que solo se puede seleccionar uno de estos botones de opción.

Puedo tener tres propiedades en el modelo de vista ... para cada una de estas tres opciones ... y puedo verificar cuál se selecciona.

Function() 
{ 
    if (Is_Individual_property) 
    { 
    // Individual selected 
    } 

    if (Is_Group_property) 
    { 
    // group selected 
    } 
    if (Is_Both_property) 
    { 
    // Both selected 
    } 
} 

pero creo que esto es no mejor enfoque.

¿Puedo tener solo una propiedad en el modelo de vista y enlazar los valores en consecuencia?

+1

IMO cambia el tipo de datos de su modelo a enum. Es más significativo para selecciones exclusivas mutuas de su botón de opción, y para representarlo en wpf puede representar todas las opciones de su enumeración. –

Respuesta

21

¿Qué tal tener una sola propiedad y administrar múltiples valores con un convertidor? Por ejemplo:

XAML:

<Grid> 
    <Grid.Resources> 
     <local:BooleanToStringValueConverter x:Key="BooleanToStringValueConverter" /> 
    </Grid.Resources> 
    <StackPanel> 
     <TextBlock Text="{Binding Property1}" /> 
     <RadioButton Name="RadioButton1" 
        GroupName="Group1" 
        Content="Value1" 
        IsChecked="{Binding Path=Property1, Converter={StaticResource BooleanToStringValueConverter}, ConverterParameter=Value1}" /> 
     <RadioButton Name="RadioButton2" 
        GroupName="Group1" 
        Content="Value2" 
        IsChecked="{Binding Path=Property1, Converter={StaticResource BooleanToStringValueConverter}, ConverterParameter=Value2}" /> 
     <RadioButton Name="RadioButton3" 
        GroupName="Group1" 
        Content="Value3" 
        IsChecked="{Binding Path=Property1, Converter={StaticResource BooleanToStringValueConverter}, ConverterParameter=Value3}" /> 
    </StackPanel> 
</Grid> 

Convertidor:

public class BooleanToStringValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (System.Convert.ToString(value).Equals(System.Convert.ToString(parameter))) 
     { 
      return true; 
     } 
     return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (System.Convert.ToBoolean(value)) 
     { 
      return parameter; 
     } 
     return null; 
    } 
} 

Clase:

public class MyClass : INotifyPropertyChanged 
{ 
    private String _property1; 
    public String Property1 
    { 
     get { return _property1; } 
     set { _property1 = value; RaisePropertyChanged("Property1"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void RaisePropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler temp = PropertyChanged; 
     if (temp != null) 
     { 
      temp(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Ventana:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = new MyClass() { Property1 = "Value1" }; 
    } 
} 
+0

Estaba buscando convertidores ... Pero tengo una pregunta ... ¿Podemos usar una enumeración en lugar de cadenas en el parámetro convertidor – Relativity

+1

Por supuesto, usted puede! – decyclone

Cuestiones relacionadas