委托在 Windows C# WPF 之间传递数据
本文关键字:之间 数据 WPF Windows | 更新日期: 2023-09-27 18:31:58
我正在尝试使用Delegates
在两个Windows
之间传递数据。我希望当用户单击主Window
上的按钮时出现People
列表,这将允许用户选择一个Person
。完成此操作后,它将在原始表单上填写带有Person
名称的TextBox
。
我开始比这简单得多,但是为了解决Delegates
问题,并且在了解如何使用 Delegates
在单独的Windows
上调用方法时遇到了问题。这就是我迄今为止所尝试的;
主Window
上等待string
的方法(显示消息);
public static DelegateTestWindow.TestDelegate ShowDelegateMessage(string message)
{
MessageBox.Show(message);
return null;
}
包含Delegate
的第二个Window
;
public partial class DelegateTestWindow : Window
{
public delegate string TestDelegate();
public DelegateTestWindow()
{
InitializeComponent();
}
private void TestDelegateClick(object sender, RoutedEventArgs e)
{
var tDelegate = new TestDelegate(CompanyManagement.ShowDelegateMessage("Test"));
this.Close();
}
}
这确实显示一条消息说"测试",但它在这样做后也会抛出Exception
:Delegate to an instance method cannot have null 'this'.
MainWindow
上的方法对我来说尤其不正确,但是在尝试了不同的选项后,这是我最接近工作Delegate
。有人可以解释一下我在这里(显然)出错的地方以及我如何改进我现在拥有的系统吗?
就像垫子链接一样,事件是一种特殊的代表,这可能是您正在寻找的。
我写了一个小例子,希望这足以让您解决问题。
public partial class Form1 : Form
{
public event EventHandler PersonSelected;
public String PersonName { get; set; }
public Form1()
{
InitializeComponent();
PersonName = "Person's name";
}
protected override void OnClick(EventArgs e)
{
Form2 form2 = new Form2(this);
form2.Show();
PersonSelected(this, EventArgs.Empty);
}
}
public partial class Form2 : Form
{
public Form2(Form1 form)
{
InitializeComponent();
form.PersonSelected += (sender, args) =>
{
Form1 form1 = sender as Form1;
if(form1 != null)
textBox1.Text = form1.PersonName;
};
}
}
现在,这可以以不同的方式完成,并且比这更好,但是我认为这应该足够了。当你让它工作时,我建议你研究另一种方法。通常,您将创建一个继承自 EventArgs 的 PersonEventArgs 类。然后,此类包含对该人的引用。这是一个带有示例的体面链接:https://msdn.microsoft.com/en-us/library/system.eventargs(v=vs.110).aspx
祝你好运:)