2010-03-19 12 views
5

Wenn ich drei Radiobuttons habe, was ist der beste Weg, sie an ein Enum zu binden, das die gleichen Möglichkeiten hat? z.B.Winforms Bind Enum zu Radio Buttons

[] Choice 1 
[] Choice 2 
[] Choice 3 

public enum MyChoices 
{ 
    Choice1, 
    Choice2, 
    Choice3 
} 

Antwort

1

Ich weiß, dass dies eine alte Frage ist, aber es war die erste, die in meinen Suchergebnissen auftauchte. Ich dachte, eine generische Art und Weise aus Radio-Buttons Enum zu binden, oder sogar einen String oder eine Zahl usw.

private void AddRadioCheckedBinding<T>(RadioButton radio, object dataSource, string dataMember, T trueValue) 
    { 
     var binding = new Binding(nameof(RadioButton.Checked), dataSource, dataMember, true, DataSourceUpdateMode.OnPropertyChanged); 
     binding.Parse += (s, a) => { if ((bool)a.Value) a.Value = trueValue; }; 
     binding.Format += (s, a) => a.Value = ((T)a.Value).Equals(trueValue); 
     radio.DataBindings.Add(binding); 
    } 

Und dann entweder auf dem Formular Konstruktor oder auf dem Load-Ereignis Form, nennen es auf jedem Ihrer RadioButton Kontrollen. Das dataSource ist das Objekt, das Ihre Enum-Eigenschaft enthält. Ich stellte sicher, dass dataSource implementiert die INotifyPropertyChanged Schnittstelle feuert das Ereignis in der enum Eigenschaften Setter.

AddRadioCheckedBinding(Choice1RadioButton, dataSource, "MyChoice", MyChoices.Choice1); 
AddRadioCheckedBinding(Choice2RadioButton, dataSource, "MyChoice", MyChoices.Choice2); 
2

Können Sie drei boolean Eigenschaften erstellen:

private MyChoices myChoice; 

public bool MyChoice_Choice1 
{ 
    get { return myChoice == MyChoices.Choice1; } 
    set { if (value) myChoice = MyChoices.Choice1; myChoiceChanged(); } 
} 

// and so on for the other two 

private void myChoiceChanged() 
{ 
    OnPropertyChanged(new PropertyChangedEventArgs("MyChoice_Choice1")); 
    OnPropertyChanged(new PropertyChangedEventArgs("MyChoice_Choice2")); 
    OnPropertyChanged(new PropertyChangedEventArgs("MyChoice_Choice3")); 
} 

dann binden an MyChoice_Choice1 und die anderen?

0

Ich dachte nur, ich würde hinzufügen, wie ich es gerade mache. Es gibt keine "Bindung" als solche, aber hoffentlich macht es den gleichen Job.

Kommentare willkommen.

public enum MyChoices 
{ 
    Choice1, 
    Choice2, 
    Choice3 
} 

public partial class Form1 : Form 
{ 
    private Dictionary<int, RadioButton> radButtons; 
    private MyChoices choices; 

    public Form1() 
    { 
     this.InitializeComponent(); 
     this.radButtons = new Dictionary<int, RadioButton>(); 
     this.radButtons.Add(0, this.radioButton1); 
     this.radButtons.Add(1, this.radioButton2); 
     this.radButtons.Add(2, this.radioButton3); 

     foreach (var item in this.radButtons) 
     { 
      item.Value.CheckedChanged += new EventHandler(RadioButton_CheckedChanged); 
     } 
    } 

    private void RadioButton_CheckedChanged(object sender, EventArgs e) 
    { 
     RadioButton button = sender as RadioButton; 
     foreach (var item in this.radButtons) 
     { 
      if (item.Value == button) 
      { 
       this.choices = (MyChoices)item.Key; 
      } 
     } 
    } 

    public MyChoices Choices 
    { 
     get { return this.choices; } 
     set 
     { 
      this.choices = value; 
      this.SelectRadioButton(value); 
      this.OnPropertyChanged(new PropertyChangedEventArgs("Choices")); 
     } 
    } 

    private void SelectRadioButton(MyChoices choiceID) 
    { 
     RadioButton button; 
     this.radButtons.TryGetValue((int)choiceID, out button); 
     button.Checked = true; 
    } 
}