Cập nhật: Tôi đã kiểm tra câu trả lời trước khi tôi kiểm tra đầy đủ nó vẫn không hoạt động. Tôi đã cập nhật mã dưới đây, do đó bạn chỉ có thể dán vào một dự án WinForms trống và nó sẽ biên dịch.ComboBox sẽ không cập nhật danh sách hiển thị trừ khi bạn thay đổi lựa chọn đầu tiên
CẬP NHẬT: Tôi đã tìm thấy rằng nếu tôi thay đổi mục đã chọn trên ComboBox thành bất kỳ mục nào khác, nó bây giờ hoạt động như mong đợi (trong mã của tôi dưới đây tôi sẽ chuyển từ test1 sang test2). Vì tôi chưa nhận được bất kỳ câu trả lời nào, tôi đã thay đổi câu hỏi này.
Tại sao tôi phải thay đổi thành một mục khác trong hộp tổ hợp trước khi nó hiển thị những thay đổi tôi thực hiện cho nguồn dữ liệu cơ bản?
Đây là trường hợp kiểm tra nhanh về những gì đang xảy ra.
- Thay đổi
test1
đểtest1asdf
văn bản trong txtBroken - nhấp chuột tắt để thực hiện thay đổi
- văn bản trong combo box không cập nhật.
- Thay đổi combo box để Test2
- thay đổi
test2
-test2asdf
văn bản trong txtBroken - bấm tắt để thực hiện thay đổi
- văn bản trong combo box ngay lập tức cho thấy 'test2asdf' vẫn hiển thị
test1
cho mục đầu tiên trong danh sách thả xuống - thay đổi
test1
- màn combo box
test1
hộp văn bản hiển thịtest1asdf
- cập nhật văn bản b bò để
test1asd
- combo box ngay lập tức hiển thị
test1asd
khác hơn đằng sau hậu trường thay đổi mục đã chọn vào tải và thay đổi nó trở lại (điều này có vẻ như một hack như vậy) làm thế nào tôi có thể sửa lỗi này?
Tôi có một databound combo box để một BindingSource
ràng buộc với một List<Holder>
nó có Holder.Name
như giá trị hiển thị của nó. Tôi cũng có một hộp văn bản ràng buộc với Holder.Name
nhưng nếu tôi thay đổi văn bản trong hộp văn bản, nó sẽ không thay đổi nội dung được hiển thị trong hộp tổ hợp. Thay đổi các mục đã chọn và thay đổi lại sẽ hiển thị văn bản được cập nhật trong hộp văn bản, nhưng vẫn sẽ có giá trị cũ được hiển thị trong hộp tổ hợp. Làm cách nào để tôi tạo mục trong bản cập nhật hộp kết hợp?
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Sandbox_Form
{
public class Form1 : Form
{
public Form1()
{
InitializeComponent();
lstBroken = new BindingList<Holder>();
lstBroken.Add(new Holder("test1"));
lstBroken.Add(new Holder("test2"));
bsBroken = new BindingSource(lstBroken, null);
cmbBroken.DataSource = bsBroken;
cmbBroken.DisplayMember = "Name";
cmbBroken.SelectedIndex = 0;
txtBroken.DataBindings.Add("Text", bsBroken, "Name");
txtBroken.TextChanged += new EventHandler(txtBroken_TextChanged);
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
void txtBroken_TextChanged(object sender, EventArgs e)
{
((Control)sender).FindForm().Validate();
}
private BindingSource bsBroken;
private BindingList<Holder> lstBroken;
private ComboBox cmbBroken;
private TextBox txtBroken;
private Label label1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.cmbBroken = new System.Windows.Forms.ComboBox();
this.txtBroken = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// cmbBroken
//
this.cmbBroken.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbBroken.FormattingEnabled = true;
this.cmbBroken.Location = new System.Drawing.Point(12, 32);
this.cmbBroken.Name = "cmbBroken";
this.cmbBroken.Size = new System.Drawing.Size(94, 21);
this.cmbBroken.TabIndex = 0;
//
// txtBroken
//
this.txtBroken.Location = new System.Drawing.Point(13, 60);
this.txtBroken.Name = "txtBroken";
this.txtBroken.Size = new System.Drawing.Size(93, 20);
this.txtBroken.TabIndex = 1;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(13, 13);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(41, 13);
this.label1.TabIndex = 2;
this.label1.Text = "Broken";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 262);
this.Controls.Add(this.label1);
this.Controls.Add(this.txtBroken);
this.Controls.Add(this.cmbBroken);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private void cmbWorks_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
public class Holder
{
public Holder(string name)
{
Name = name;
}
private string _Name;
public string Name
{
get { return _Name; }
set
{
_Name = value;
}
}
}
}
Nếu tôi liên kết với một List<String>
thay vì sử dụng Holder.Name
nó hoạt động như mong đợi (đây chỉ là một đơn giản mock-up, lớp thực có nhiều hơn chỉ là một tên do đó, một danh sách các chuỗi sẽ không hoạt động). Tôi nghĩ rằng đây là một đầu mối cho những gì là sai, nhưng tôi không biết nó là gì. Sử dụng một Observable thay vì một danh sách không tạo ra sự khác biệt nào.
Thực tế đặt txtBackupName datacontext thành mục đã chọn của cboJobSelector, sau đó liên kết với thuộc tính Tên, làm liên kết hiện tại của bạn với thuộc tính văn bản của hộp tổ hợp. Theo như tôi biết hộp kết hợp sẽ không cập nhật nguồn gốc nếu bạn thay đổi thuộc tính văn bản hiện tại của nó. –
@LnDCobra Tôi làm như thế nào? –
@Scott Tôi không chắc chắn làm thế nào chính xác để làm điều đó trong mã, tôi biết làm thế nào để làm điều đó xaml, nhưng tôi có thể hỏi tại sao bạn đang sử dụng ràng buộc với winforms? và không chỉ sử dụng WPF? –