2010-12-04 4 views
10

У меня есть приложение WPF-MVVM ...Как связать выбор переключателя WPF с Viewmodel с помощью конверсий?

У меня есть 3 кнопки управления радиокнопками - с тремя вариантами => «Индивидуальный», «Группа» и «Оба». Все 3 имеют одинаковое название группы ... это означает, что можно выбрать только один из этих переключателей.

Я могу иметь три свойства в viewmodel ... для каждого из этих трех вариантов ... и может проверить, какой из них выбран.

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

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

Но я думаю, что это не лучший подход.

Могу ли я иметь только одно свойство в viewmodel и привязывать значения соответственно?

+1

IMO изменяет тип данных вашей модели на перечисление. Это более значимо для взаимного эксклюзивного выбора вашего переключателя, и для его представления в wpf вы можете отобразить все параметры вашего перечисления. – 2010-12-04 06:08:46

ответ

21

Как получить одно свойство и управлять несколькими значениями с помощью конвертера. Например:

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> 

Преобразователь:

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

Класс:

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)); 
     } 
    } 
} 

Окно:

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

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

Я искал конвертеры. Но у меня есть один вопрос. Может быть, мы используем перечисление вместо строк в ConverterParameter. – Relativity 2010-12-04 17:50:30

Смежные вопросы