Данные, связывающие Enum, хранящиеся в объекте, в Winforms ComboBox? - PullRequest
5 голосов
/ 06 января 2010

Кто-нибудь знает, как это сделать?

Я пытался это , но он просто заполняет этот ComboBox, который я уже делаю.

Мне нужен способ обновить поле со списком при каждом изменении свойства enum моего объекта:

DataObject.DataEnum

, но также обновляйте перечисленные выше Enum всякий раз, когда я изменяю выбранный элемент в выпадающем списке.

Возможно ли это сделать?

Обычно я привык связывать так:

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

, который прекрасно работает.

1 Ответ

4 голосов
/ 06 января 2010

Вы можете использовать двустороннюю привязку к свойству SelectedItem ComboBox. При добавлении значений в поле со списком обязательно добавьте значения перечисления, а не только строки, соответствующие их отображаемому имени.

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

Теперь SelectedItem можно установить или получить как перечисление, а не как строку.

EDIT

Похоже, что ваш объект не вызывает уведомлений об изменении свойств, которые требуются Windows Forms для обнаружения необходимости обновления изменений базового объекта в пользовательском интерфейсе. Вот статья о том, как это сделать.

РЕДАКТИРОВАТЬ 2

Вот пример кода. Я проверил, что это работает правильно.

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

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...