web-dev-qa-db-fra.com

Créer un événement wpf personnalisé

j'ai créé une connexion UserControl for Database où l'utilisateur saisit le nom d'utilisateur et le mot de passe pour une connexion. Ce UserControl est dans un MainWindow.xaml

Maintenant, dans le code derrière mon UserControl, je crée une connexion MSSQL. Si vous vous connectez avec succès, je souhaite déclencher un événement personnalisé à exposer dans MainWindow.

Par exemple dans 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);
}

et dans MainWindow.xaml, je veux utiliser un événement 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>

J'en ai besoin pour une connexion de type multiple (MSSQL, Oracle, MySql, etc.).

Comment obtenir ceci?

16
davymartu

Vous devez d'abord définir un délégué, puis utiliser ce délégué pour définir cet événement.

Dans votre fichier MyUserControl.xaml.cs, ajoutez ce qui suit

Option 1

    public delegate void MyPersonalizedUCEventHandler(string sampleParam);

    public event MyPersonalizedUCEventHandler MyPersonalizedUCEvent;

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

Et c'est tout. Vous avez défini votre événement.

Option 2

    public event Action<String> MyPersonalizedUCEvent;

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

Pour en savoir plus sur le délégué Action, consultez ce lien .

Remarque:

Dans de nombreux cas, si les événements ne sont pas utilisés correctement, ils peuvent provoquer des fuites de mémoire. Assurez-vous simplement que vous avez écrit du code pour supprimer les gestionnaires d'événements enregistrés comme indiqué ci-dessous.

        MyPersonalizedUCEvent -= MyPersonalizedUCEventHandler;
26
Anand Murali

Créez d'abord un événement public dans votre classe:

public event EventHandler<MyEventArgs> SomethingChanged;

NB MyEventArgs est le type d'objet qui sera transmis avec l'événement aux abonnés. Pour cet exemple, cela pourrait être comme ceci:

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

Ensuite, tirez-le tel quel dans votre classe:

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

Finalement, gérez-le comme ceci:

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

NB Vous devez vous abonner à l'événement pour entrer dans la méthode OnSometingChanged. Abonnez-vous comme ceci:

myClass.SomethingChanged+=OnSomethingChanged;

myClass est une instance de la classe où vous définissez SomethingChanged

10
Marc_Alx