2013-01-24 2 views
11

사용자 연결에 대한 사용자 이름과 암호를 입력하는 데이터베이스 연결 용 UserControl을 만들었습니다. 이 UserControl은 MainWindow.xaml에 있습니다.사용자 지정 wpf 이벤트 만들기

이제 UserControl의 코드에서 MSSQL 연결을 만듭니다. 성공적으로 로그인했다면, MainWindow에서 노출 할 커스텀 이벤트를 발생시키고 싶습니다. 내가 mypersonalized 이벤트를 사용할

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에서 MyUserControl.xaml.cs 예를 들어

:

<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, 오라클, 마이 SQL 등).

어떻게 만드나요?

답변

18

먼저 대리인을 정의한 다음 해당 대리인을 사용하여 해당 이벤트를 정의해야합니다. 당신의 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"); 
     } 
    } 

에게 추가 파일 그리고 바로 그거야. 이벤트를 정의했습니다.

옵션 Action 대표 약 2

public event Action<String> MyPersonalizedUCEvent; 

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

더이 link에서 찾을 수 있습니다.

참고 : 이벤트가 사용되지 않는 경우 많은 경우에

제대로가 발생할 수 메모리 누수. 아래에 표시된 것처럼 등록 된 이벤트 핸들러를 제거하는 코드를 작성했는지 확인하십시오.

 MyPersonalizedUCEvent -= MyPersonalizedUCEventHandler; 
+3

@davymartu를 정의하지만 그 대신 자신의 대리자 형식을 정의, 당신은 일반적으로 미리 정의 된 것들 중 하나를 사용하는 것이 클래스의 인스턴스입니다

myClass.SomethingChanged+=OnSomethingChanged; 

을 [EventHandler] (http://msdn.microsoft.com/en-us/library/system.eventhandler.aspx) 또는 [EventHandler ] (http://msdn.microsoft.com/en-us/library/db0etb8x. aspx). – Clemens

+0

간단한 이벤트를 정의했습니다. 그러나 이벤트를 상위 컨테이너로 버블 링하려면 라우팅 된 이벤트를 만들어야하며 iltzortz 응답은이를 만드는 방법을 설명합니다. –

5

먼저 클래스의 공용 이벤트를 만들 :

public event EventHandler<MyEventArgs> SomethingChanged; 

NBMyEventArgs는 가입자에게 이벤트와 함께 전달되는 개체의 유형입니다. 이 예는 다음과 같이 수 :

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

다음 불을 클래스에있는 그대로 :이 같은

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

그것을 처리 :

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

NB 당신 OnSometingChanged 방법으로 입장하려면 이벤트에 가입해야합니다.이 같은 구독 : myClass 같이, 당신은 SomethingChanged