2010-01-06 40 views
5

Bất cứ ai cũng biết cách làm điều này?Dữ liệu ràng buộc một Enum được lưu trữ trong một đối tượng vào một ComboBox Winforms?

Tôi đã thử this, nhưng nó chỉ điền ComboBox này mà tôi đã làm.

Những gì tôi cần là một cách để có được các combobox được cập nhật bất cứ khi nào enum tài sản trên những thay đổi đối tượng của tôi:

DataObject.DataEnum 

nhưng cũng nhận được trên Enum được cập nhật bất cứ khi nào tôi thay đổi mục đã chọn trong combobox.

Có thể thực hiện việc này không?

Bình thường, tôi đang sử dụng để làm các ràng buộc theo cách này:

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

mà hoạt động tuyệt vời.

+0

Bạn đã thử chưa? – SLaks

+0

Cái nào? Tôi đã thử bài viết nhưng nó không giải quyết được vấn đề khi tôi cập nhật DataObject.DataEnum, ComboBox không cập nhật. Nếu tôi phải làm điều đó bằng tay quá, thì những gì tốt là databinding. Tôi có thể tự làm tất cả bằng tay. –

+0

Bạn có thể không tăng thông báo thay đổi thuộc tính? Windows Forms sẽ sử dụng sự kiện INotifyPropertyChanged hoặc DataEnumChanged để phát hiện các thay đổi đối tượng bên dưới của bạn. Bạn sẽ cần phải thực hiện một hoặc cái khác để Windows Forms ràng buộc để biết rằng một sự thay đổi đã xảy ra. – Josh

Trả lời

4

Bạn có thể sử dụng liên kết hai chiều trên thuộc tính SelectedItem của ComboBox. Khi thêm giá trị vào hộp kết hợp, hãy đảm bảo thêm các giá trị enum và không chỉ các chuỗi khớp với tên hiển thị của chúng.

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

Bây giờ SelectedItem có thể được đặt hoặc nhận dưới dạng enum thay vì chuỗi.

EDIT

Nghe có vẻ như có thể đối tượng của bạn không làm tăng thông báo thay đổi sở hữu mà Windows Forms đòi hỏi để phát hiện rằng những thay đổi đối tượng cơ bản cần phải được làm mới trong giao diện người dùng. Here is an article về cách thực hiện điều đó.

EDIT 2

Đây là một mẫu mã. Tôi đã xác minh điều này hoạt động chính xác.

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

Vì vậy, tôi có thể sử dụng ColourList.DataSource = Enum.GetValues ​​(typeof (Color)); để điền ComboBox? –

+0

Đã lâu rồi kể từ khi tôi sử dụng Windows Forms nhưng tôi nghĩ rằng nó sẽ hoạt động tốt. – Josh

+0

Cảm ơn tôi sẽ cố gắng và cho bạn biết. –

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