Создание пользовательского события wpf
Я создал соединение UserControl для базы данных, где пользователь вводит имя пользователя и пароль для подключения.
Этот UserControl находится в MainWindow.xaml
Теперь, в коде моего UserControl, я создаю соединение MSSQL. Если login Успешно, я хочу Поднять пользовательское событие, чтобы открыть его в 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 и т.д.).
Как это получить?
Ответы
Ответ 1
Сначала вы должны определить делегата, а затем использовать этот делегат для определения этого события.
В файле 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;
Ответ 2
Сначала создайте публичное событие в своем классе:
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