For this kind of "dedicated event/message passing" I prefer to use the 'Action delegate Type:
public Action<string> OnTitleChanged;
private void textBox1_TextChanged(object sender, EventArgs e)
{
if(OnTitleChanged != null) OnTitleChanged(textBox1.Text);
}
public void SetText(string theText)
{
textBox1.Text = theText;
}
private void Form1_Load(object sender, EventArgs e)
{
userControl1Instance.OnTitleChanged = userControl2Instance.SetText;
}</string>
Notes:
1. An Action<> (or a Func<>) is a full-featured Delegate Type; they are capable of having multiple subscribers which can be set, or removed, using += and -= syntax.
2. By directly assigning a reference to a method (whose Type parameters match the Action specification) ... rather than using +=, you essentially "dedicate" this Action to one purpose, which is passing a string to whatever method it encapsulates.
I believe this usage is a good thing, because:
a. it is simplifying: you get the "good parts" of an Event/EventHandler without the need to create Custom EventArguments, etc.
b. imho, the use of this "pattern" is communicates the intent of the programmer to have a "dedicated Event/EventHandler" that does "one thing."
3. imho, this "pattern" should not be used where you are publishing your code with the expectation that end-users may create multiple subscribers to it ... although that could be used without error with Action, or Func.