6

我试图找到如何将布尔值分配给复选框。我希望我的 checkbox.checked 值在我的布尔数据更改时自动刷新。我知道对于 ComboBox 有一个 DataSource 属性,它用一个列表组成,但我找不到复选框的等价物。

我尝试使用 checkBox.DataBindings 但它似乎不起作用。另一方面,我真的不知道第三个属性是什么意思。

checkBox.DataBindings.Add("Checked", DisableBugWatcher, "check");

我需要它,因为我有两个独立的窗口可以刷新相同的复选框值!

编辑 :

我尝试使用事件来更新我的主 GUI,但它说:跨线程操作无效:控制'checkBox'从创建它的线程以外的线程访问。

问题在于 bool 值是从其他线程刷新的事实,而不是它影响的线程。

4

2 回答 2

4

要使 DataBindings 工作,您必须在包含您的 bool 值的类中实现INotifyPropertyChange 。如果您从 UI 线程以外的线程访问 myValue,则必须使用 SynchronizationContext 并在 UI 线程中初始化 myObject。

public class myObject : INotifyPropertyChanged
{
    // The class has to be initialized from the UI thread
    public SynchronizationContext context = SynchronizationContext.Current;

    bool _myValue;
    public bool myValue
    {
        get
        {
            return _myValue;
        }
        set
        {
            _myValue = value;

            // if (PropertyChanged != null)
                // PropertyChanged(this, new PropertyChangedEventArgs("myValue"));

            if (PropertyChanged != null)
            {
                context.Send(
                    new SendOrPostCallback(o => 
                       PropertyChanged(this, new PropertyChangedEventArgs("myValue"))
                    ), null);
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

然后,将您的 DataBinding 设置为:

checkBox1.DataBindings.Add("Checked", myObject.GlobalObject, "myValue");

第一个参数是要绑定的 UI 对象的属性。第二个属性是你的目标对象实例,第三个是需要绑定到第一个的目标对象的属性名。

我尽力使用每秒切换 myValue 的计时器来反映您的场景(相应地选中复选框)。这是我使用的表格的代码:

System.Timers.Timer x = new System.Timers.Timer();
myObject target;

public Form1()
{
    InitializeComponent();

    target = new myObject();

    x.Elapsed += (s, e) =>
        {
            target.myValue = !target.myValue;
        };
    x.Interval = 1000;

    checkBox1.DataBindings.Add("Checked", target, "myValue");

    x.Start();
}
于 2013-03-07T06:47:01.370 回答
1

我和朋友一起找到了一种更简单的方法来解决我的问题。我使用表单中的 DialogResult。当我从表单返回时,它给了我按钮单击的状态,它给了我文本框的值。相同的代码适用于我的复选框问题。

这是代码的示例:

public partial class MainWindow : Form
{

    private OtherWindow m_otherWindow;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Lazy create other window if it doesn't exist.
        m_otherWindow = m_otherWindow ?? new OtherWindow();

        // Passe textbox value to other window.
        m_otherWindow.PassedValue=textBox1.Text;
        if (m_otherWindow.ShowDialog()==DialogResult.OK)
        {
            // Clicked ok : update textbox value with textbox value of other window.
            textBox1.Text=m_otherWindow.PassedValue;
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Close();
    }
}

public partial class OtherWindow : Form
{

    /// <summary>
    /// Value to be passed to the window.
    /// </summary>
    public string PassedValue
    {
        get { return textBox1.Text; }
        set { textBox1.Text = value; }
    }

    public OtherWindow()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        DialogResult = DialogResult.OK;
    }
}
于 2013-03-07T19:46:02.780 回答