2010-01-06 19 views
5

¿Alguien sabe cómo hacer esto?¿Vinculación de datos un Enum almacenado en un objeto en un ComboBox de Winforms?

Intenté this, pero simplemente llena este ComboBox que ya hago.

Lo que necesito es una manera de conseguir el cuadro combinado actualizada cada vez que la propiedad de enumeración de mis cambios de objeto:

DataObject.DataEnum 

sino también obtener lo anterior enumeración actualiza cada vez que cambio el elemento seleccionado en el cuadro combinado.

¿Es posible hacer esto?

Normalmente estoy acostumbrado a hacer la unión de esta manera:

this.TextBox.DataBindings.Add ("Text", this.DataObject, "Name", false, DataSourceUpdateMode.OnPropertyChanged); 

la que funciona muy bien.

+0

¿Lo intentó? – SLaks

+0

¿Cuál? Intenté el artículo pero no resuelve el problema cuando actualizo DataObject.DataEnum, el ComboBox no se actualiza. Si también tengo que hacerlo manualmente, ¿de qué sirve el enlace de datos? Podría hacerlo todo yo mismo a mano. –

+0

¿No estás levantando una notificación cambiada de propiedad? Windows Forms utilizará INotifyPropertyChanged o un evento DataEnumChanged para detectar cambios en su objeto subyacente. Tendrá que hacer una u otra para que el enlace de Windows Forms sepa que se ha producido un cambio. – Josh

Respuesta

4

Puede usar un enlace bidireccional en la propiedad SelectedItem del ComboBox. Al agregar valores al cuadro combinado, asegúrese de agregar los valores enum y no solo las cadenas que coincidan con su nombre para mostrar.

comboBox.Items.Add(ConsoleColor.Red); 
comboBox.Items.Add(ConsoleColor.Blue); 
// ... etc 

Ahora SelectedItem se puede fijar o para conseguir que la enumeración en lugar de como una cadena.

EDITAR

suena como tal vez su objetivo no plantea notificaciones de cambio de propiedad que forma Windows requiere para detectar que los cambios en el objeto subyacente necesitan ser refrescados en la interfaz de usuario. Here is an article acerca de cómo hacer eso.

EDIT 2

Aquí está un ejemplo de código. Verifiqué que esto funciona correctamente.

public partial class Form1 : Form { 

    private Person p = new Person(); 

    public Form1() { 

     InitializeComponent(); 

     comboBox1.DataSource = Enum.GetValues(typeof(Gender)); 

     textBox1.DataBindings.Add("Text", p, "Name", false, DataSourceUpdateMode.OnPropertyChanged); 
     comboBox1.DataBindings.Add("SelectedItem", p, "Gender", false, DataSourceUpdateMode.OnPropertyChanged); 

     label1.DataBindings.Add("Text", p, "Name", false, DataSourceUpdateMode.Never); 
     label2.DataBindings.Add("Text", p, "Gender", false, DataSourceUpdateMode.Never); 

    } 
    private void Form1_Load(object sender, EventArgs e) { 
     // yeah, that's right i voted for him, 
     // go ahead and downvote me 
     p.Name = "John McCain"; 
     p.Gender = Gender.Male; 
    } 
    private void Form1_Click(object sender, EventArgs e) { 
     p.Name = "Sarah Palin"; 
     p.Gender = Gender.Female; 
    } 
} 

public enum Gender { 
    Male, 
    Female 
} 

public class Person : INotifyPropertyChanged { 

    private string name; 
    private Gender gender; 

    public string Name 
    { 
     get { return name; } 
     set { 
      name = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
     } 
    } 

    public Gender Gender { 
     get { return gender; } 
     set { 
      gender = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Gender")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged = delegate {}; 

} 
+0

Entonces puedo usar ColourList.DataSource = Enum.GetValues ​​(typeof (Color)); para poblar el ComboBox? –

+0

Ha pasado un tiempo desde que utilicé Windows Forms, pero sí creo que debería funcionar bien. – Josh

+0

Gracias, intentaré y le haré saber. –

Cuestiones relacionadas