在UserControl之间移动字符串不起作用

时间:2017-03-26 06:30:10

标签: c# winforms

我正在尝试在表单之间传递字符串。为什么不呢?我错过了什么或者是程序中的错误还是什么?

在UserControl3上

 UserControl1 u1;

    public UserControl3()
    {
           u1 = new UserControl1();
           InitializeComponent();
    }

在UserControl3上

public void materialCheckBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (materialCheckBox1.Checked)
            {
                u1.toUserControl3 = "GOINTHEBOX!";
            }
            else
            {
                u1.toUserControl3 = string.Empty;
            }


        }

在UserControl1上

public string toUserControl3
        {
            get
            {
                return textBox1.Text;
            }
            set
            {
                textBox1.Text = value;
            }
        }

在UserControl1上

public void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

1 个答案:

答案 0 :(得分:0)

通过一段代码更改控件上的Text属性并不一定意味着值控件将更新。通常,您需要在您的属性(在本例中为toUserControl3)与您的控件之间进行某种绑定。您需要一种方法来告诉您的控件值已更改,因此它知道要更新。

您可以通过以下方式完成数据绑定:

创建一个新类来处理状态和绑定:这消除了将控件传递给其他控件的构造函数的任何需要。

public class ViewModel : INotifyPropertyChanged
{
    public string TextBoxText => CheckBoxChecked ? "GOINTOTHEBOX!" : string.Empty;

    public bool CheckBoxChecked
    {
        get { return _checkBoxChecked; }
        set 
        { 
            _checkBoxChecked = value; 
            OnPropertyChanged("CheckBoxChecked"); 
        }
    }

    private bool _checkBoxChecked;
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

这是您的主要表单

public void Form1
{
    public Form1(ViewModel viewModel)
    {
        UserControl1.DataBindings.Add("TextBoxTextProperty", viewModel, "TextBoxText");
        UserControl3.DataBindings.Add("MaterialCheckBoxCheckedProperty", viewModel, "CheckBoxChecked");
    }
}

<强>的UserControl1

public void UserControl1()
{
    public string TextBoxTextProperty
    {
        get { return textBox1.Text; }
        set { textBox1.Text = value; }
    }
}

<强> UserControl3

public void UserControl3()
{
    public bool MaterialCheckBoxCheckedProperty
    {
        get { return materialCheckBox1.Checked; }
        set { materialCheckBox1.Checked = value; }
    }
}