2013-01-24 19 views
11

Ho creato un controllo UserControl per database in cui l'utente immette nome utente e password per una connessione. Questo UserControl si trova in un MainWindow.xamlCrea evento wpf personalizzato

Ora, nel codice dietro del mio UserControl creo una connessione MSSQL. Se accedi correttamente, voglio sollevare un evento personalizzato per esporlo in MainWindow.

Per esempio in 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); 
} 

e In MainWindow.xaml voglio usare evento 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> 

ho bisogno di questo per la connessione di tipo multiplo (MSSQL, Oracle, MySql ecc.).

Come ottenere questo?

risposta

18

Per prima cosa è necessario definire un delegato e quindi utilizzare quel delegato per definire quell'evento.

Nei tuoi MyUserControl.xaml.cs il file aggiungere la seguente

Opzione 1

public delegate void MyPersonalizedUCEventHandler(string sampleParam); 

    public event MyPersonalizedUCEventHandler MyPersonalizedUCEvent; 

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

E questo è tutto. Hai definito il tuo evento.

Opzione 2

public event Action<String> MyPersonalizedUCEvent; 

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

Maggiori informazioni sul Action delegato si possono trovare in questo link.

Nota:

In molti casi, se non vengono utilizzati gli eventi correttamente possono causare perdite di memoria. Assicurati di aver scritto codice per rimuovere i gestori di eventi registrati come mostrato di seguito.

 MyPersonalizedUCEvent -= MyPersonalizedUCEventHandler; 
+3

@davymartu Ma invece di definire il proprio tipo delegato, che di solito utilizzare uno di quelli predefiniti, come [EventHandler] (http://msdn.microsoft.com/en-us/library/system.eventhandler.aspx) o [EventHandler ] (http://msdn.microsoft.com/en-us/library/db0etb8x. aspx). – Clemens

+0

Ho definito un evento semplice. Tuttavia, se vuoi che l'evento bolla al contenitore genitore, devi creare un evento indirizzato e la risposta iltzortz spiega come crearlo. –

5

Innanzitutto creare un evento pubblico nella classe:

public event EventHandler<MyEventArgs> SomethingChanged; 

NBMyEventArgs è il tipo di oggetto che verrà superato con l'evento agli abbonati. Per questo esempio potrebbe essere simile a questo:

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

Prossimo fuoco così com'è nella classe:

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

finnally gestire in questo modo:

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

NB È è necessario abbonarsi all'evento per entrare nel metodo OnSometingChanged.Iscriviti in questo modo:

myClass.SomethingChanged+=OnSomethingChanged; 

Dove myClass è un'istanza della classe in cui si definiscono SomethingChanged