2013-01-24 117 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