创建自定义wpf事件

时间:2013-01-24 11:43:08

标签: c# wpf xaml events custom-event

我为数据库连接创建了一个UserControl,用户输入连接的用户名和密码。 此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中我想使用非个性化事件:

<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等)。

如何获得这个?

2 个答案:

答案 0 :(得分:25)

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

在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代表的详情,请参阅此link

注意:

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

        MyPersonalizedUCEvent -= MyPersonalizedUCEventHandler;

答案 1 :(得分:9)

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

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
}

NB 您需要订阅该活动才能输入OnSometingChanged方法。订阅如下:

myClass.SomethingChanged+=OnSomethingChanged;

其中myClass是您定义SomethingChanged

的类的实例