Создать пользовательское событие wpf

Я создал 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 я хочу использовать 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 и т. Д.).

Как это получить?

2 ответа

Сначала вы должны определить делегата, а затем использовать этот делегат для определения этого события.

В вашем файле 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 делегата можно найти по этой ссылке.

Замечания:

Во многих случаях, если события не используются должным образом, они могут вызвать утечки памяти. Просто убедитесь, что вы написали код для удаления зарегистрированных обработчиков событий, как показано ниже.

        MyPersonalizedUCEvent -= MyPersonalizedUCEventHandler;

Сначала создайте публичное мероприятие в вашем классе:

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

Другие вопросы по тегам