2012-02-09 48 views
13

Hãy tưởng tượng rằng tôi có:radiobuttons ràng buộc nhóm để sở hữu một trong WPF

<RadioButton GroupName="Group1" IsChecked="{Binding Path=RadioButton1IsChecked}" /> 
<RadioButton GroupName="Group1" IsChecked="{Binding Path=RadioButton2IsChecked}" /> 

Và sau đó trong lớp nguồn dữ liệu của tôi, tôi có:

public bool RadioButton1IsChecked { get; set; } 
public bool RadioButton2IsChecked { get; set; } 
public enum RadioButtons { RadioButton1, RadioButton2, None } 
public RadioButtons SelectedRadioButton 
{ 
    get 
    { 
     if (this.RadioButtonIsChecked) 
      return RadioButtons.RadioButton1; 
     else if (this.RadioButtonIsChecked) 
      return RadioButtons.RadioButton2; 
     else 
      return RadioButtons.None; 
    } 
} 

Tôi có thể bằng cách nào đó ràng buộc nút radio của tôi trực tiếp đến SelectedRadioButton tài sản? Tôi chỉ cần RadioButton1IsCheckedRadioButton2IsChecked thuộc tính để tính toán radio được chọn.

+0

[bài đăng blog] này (http://blogs.msdn.com/b/mthalman/archive/2008/09/04/wpf-data-binding-with-radiobutton.aspx) có thể giúp –

+0

Xem [câu trả lời của tôi trên một câu hỏi liên quan] (http://stackoverflow.com/questions/9145606/how-can-i-reduce-this-wpf-boilerplate-code/9145914#9145914), nó sẽ giúp ích. 'SelectedItem' liên kết với thuộc tính quan tâm. –

+3

Tôi thích: http://stackoverflow.com/questions/397556/how-to-bind-radiobuttons-to-an-enum – quetzalcoatl

Trả lời

15
<RadioButton GroupName="Group1" IsChecked="{Binding Path=SelectedRadioButton, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=RadioButton1}" /> 
<RadioButton GroupName="Group1" IsChecked="{Binding Path=SelectedRadioButton, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=RadioButton2}" /> 
public enum RadioButtons { RadioButton1, RadioButton2, None } 
public RadioButtons SelectedRadioButton {get;set;} 

public class EnumBooleanConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var ParameterString = parameter as string; 
      if (ParameterString == null) 
       return DependencyProperty.UnsetValue; 

      if (Enum.IsDefined(value.GetType(), value) == false) 
       return DependencyProperty.UnsetValue; 

      object paramvalue = Enum.Parse(value.GetType(), ParameterString); 
      return paramvalue.Equals(value); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var ParameterString = parameter as string; 
      var valueAsBool = (bool) value; 

      if (ParameterString == null || !valueAsBool) 
      { 
       try 
       { 
        return Enum.Parse(targetType, "0"); 
       } 
       catch (Exception) 
       { 
        return DependencyProperty.UnsetValue; 
       } 
      } 
      return Enum.Parse(targetType, ParameterString); 
     } 
    } 
+0

Điều này sẽ không đặt giá trị 'SelectedRadioButton' thành' RadioButtons.None '(bằng cách thực thi' return Enum.Parse (targetType, "0"); ') bất cứ khi nào bất kỳ thuộc tính 'IsChecked' của nút radio nào được đặt thành' false'? –

21

Khai báo một kiểu liệt kê tương tự như:

enum RadioOptions {Option1, Option2} 

XAML:

<RadioButton IsChecked="{Binding SelectedOption, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static local:RadioOptions.Option1}}"/> 
<RadioButton IsChecked="{Binding SelectedOption, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static local:RadioOptions.Option2}}"/> 

Chuyển đổi lớp:

public class EnumBooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value.Equals(parameter); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((bool)value) ? parameter : Binding.DoNothing; 
    } 
} 
+0

Sự khác biệt chức năng với câu trả lời được chấp nhận là gì? – Jerther

+2

@Jerther: câu trả lời được chấp nhận nhận một tham số chuỗi và chuyển đổi nó thành một enum. Điều này chấp nhận một giá trị enum trực tiếp, đó là một ý tưởng tốt hơn nhiều vì nó sẽ không biên dịch nếu tham số không chính xác. – Artfunkel

-1

XAML:

<RadioButton IsChecked="{Binding Path=SelectedOption, UpdateSourceTrigger=PropertyChanged}">Option1</RadioButton> 
<RadioButton IsChecked="{Binding Path=SelectedOption, UpdateSourceTrigger=PropertyChanged, Converter={v:NotBoolenConverter}}">Option2</RadioButton> 

Chuyển đổi:

public class NotBoolenConverter : IValueConverter 
    { 
     public NotBoolenConverter() 
     { 
     } 

     public override object Convert(
      object value, 
      Type targetType, 
      object parameter, 
      CultureInfo culture) 
     { 
      bool output = (bool)value; 
      return !output; 
     } 

     public override object ConvertBack(
      object value, 
      Type targetType, 
      object parameter, 
      CultureInfo culture) 
     { 
      bool output = (bool)value; 
      return !output; 
     } 
    } 

trình với 2 nút radio, bằng cách gắn một đến điều ngược lại của người kia.

Các vấn đề liên quan