我为数据库连接创建了一个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中我想使用非个性化事件:
<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等)。
如何获得这个?
答案 0 :(得分:25)
首先,您应该定义一个委托,然后使用该委托来定义该事件。
在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;
答案 1 :(得分:9)
首先在班级中创建一个公共事件:
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