2013-01-24 218 views
11

我已经创建了一个UserControl数据库连接,其中用户输入用户名和密码进行连接。 This UserControl in MainWindow.xaml创建自定义wpf事件

现在,在我的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等)。

如何得到它?

回答

18

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

在你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; 
+3

@davymartu但是,而不是定义自己的委托类型,你通常会使用预先定义子里的一个类的实例,如[EventHandler](http://msdn.microsoft.com/en-us/library/system.eventhandler.aspx)或[EventHandler ](http://msdn.microsoft.com/zh-cn/library/db0etb8x。 ASPX)。 – Clemens

+0

我定义了一个简单的事件。但是,如果您希望事件冒泡到父容器,您应该创建一个路由事件,iltzortz答案解释如何创建它。 –

5

首先在你的类中创建一个公共事件:

public event EventHandler<MyEventArgs> SomethingChanged; 

NBMyEventArgs是将与事件向用户传递对象的类型。在这个例子中它可能是这样的:

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

下一页火它,在你的类:

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

Finnally处理这样的:

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

NB你需要订阅该事件才能输入OnSometingChanged方法。订阅像这样:

myClass.SomethingChanged+=OnSomethingChanged; 

哪里myClass是你定义SomethingChanged