我正在尝试在表单之间传递字符串。为什么不呢?我错过了什么或者是程序中的错误还是什么?
在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)
{
}
答案 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; }
}
}