20

我为数据库连接创建了一个用户控件,用户输入用户名和密码进行连接。此 UserControl 位于 MainWindow.xaml

现在,在我的 UserControl 后面的代码中,我创建了一个 MSSQL 连接。如果登录成功,我想引发一个自定义事件以在 MainWindow 中公开。

例如在 MyUserControl.xaml.cs

try
{

    using (SqlConnection sqlConn = new SqlConnection(connection))
    {
        sqlConn.Open();
        MessageBox.Show("Connessione Riuscita!", "Connessione a " + TextIP.Text, MessageBoxButton.OK, MessageBoxImage.Information);
        RaiseMyEvent();
        sqlConn.Close();                 
    }
}
catch (SqlException ex)
{
    MessageBox.Show("Connessione Fallita: " + ex.Message, "Connessione a " + TextIP.Text, MessageBoxButton.OK, MessageBoxImage.Error);
}

在 MainWindow.xaml 我想使用 mypersonalized 事件:

<Window x:Class="XLogin.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:local="clr-namespace:XLogin" WindowStartupLocation="CenterScreen">
    <Grid>
        <local:DBLogin x:Name="DBLoginFrame" MyPersonalizedUCEvent="DBLoginFrame_MyPersonalizedUCEvent"/>
    </Grid>
</Window>

我需要这个用于多种类型的连接(MSSQL、Oracle、MySql 等)。

如何得到这个?

4

2 回答 2

27

首先,您应该定义一个委托,然后使用该委托来定义该事件。

在您的 MyUserControl.xaml.cs 文件中添加以下内容

选项1

    public delegate void MyPersonalizedUCEventHandler(string sampleParam);

    public event MyPersonalizedUCEventHandler MyPersonalizedUCEvent;

    public void RaiseMyEvent()
    {
        // Your logic
        if (MyPersonalizedUCEvent != null)
        {
            MyPersonalizedUCEvent("sample parameter");
        }
    }

就是这样。你已经定义了你的事件。

选项 2

    public event Action<String> MyPersonalizedUCEvent;

    public void RaiseMyEvent()
    {
        // Your logic
        if (MyPersonalizedUCEvent != null)
        {
            MyPersonalizedUCEvent("sample parameter");
        }
    }

Action可以在此链接中找到有关委托的更多信息。

笔记:

在许多情况下,如果未正确使用事件,它们可能会导致内存泄漏。只需确保您已编写代码来删除已注册的事件处理程序,如下所示。

        MyPersonalizedUCEvent -= MyPersonalizedUCEventHandler;
于 2013-01-24T12:00:16.520 回答
16

首先在您的班级中创建一个公共事件:

public event EventHandler<MyEventArgs> SomethingChanged;

NB MyEventArgs是将与事件一起传递给订阅者的对象类型。对于这个例子,它可能是这样的:

public class MyEventArgs{
    public String Prop1 {get; set;}
}

下一次在你的课堂上按原样开火:

SomethingChanged?.Invoke(this, new MyEventArgs() { Prop1="test" });

最后像这样处理它:

private void OnSomethingChanged(object sender, MyEventArgs e)
{
    //TODO
}

注意您需要订阅事件才能进入该OnSometingChanged方法。像这样订阅:

myClass.SomethingChanged+=OnSomethingChanged;

myClass您定义的类的实例在哪里SomethingChanged

于 2017-05-24T08:30:28.390 回答