委托在 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();
    }
}

这确实显示一条消息说"测试",但它在这样做后也会抛出ExceptionDelegate to an instance method cannot have null 'this'.

MainWindow上的方法对我来说尤其不正确,但是在尝试了不同的选项后,这是我最接近工作Delegate。有人可以解释一下我在这里(显然)出错的地方以及我如何改进我现在拥有的系统吗?

委托在 Windows C# WPF 之间传递数据

就像垫子链接一样,事件是一种特殊的代表,这可能是您正在寻找的。

我写了一个小例子,希望这足以让您解决问题。

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

祝你好运:)