2013-01-24 34 views
11

Tôi đã tạo một kết nối UserControl cho Cơ sở dữ liệu nơi người dùng nhập Tên người dùng và Mật khẩu để kết nối. UserControl này nằm trong MainWindow.xamlTạo sự kiện wpf tuỳ chỉnh

Bây giờ, trong mã phía sau UserControl của tôi, tôi tạo kết nối MSSQL. Nếu đăng nhập thành công, tôi muốn nâng cao một sự kiện tùy chỉnh để lộ trong MainWindow.

Ví dụ trong 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); 
} 

và In MainWindow.xaml tôi muốn sử dụng sự kiện 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> 

tôi cần điều này để kết nối nhiều loại (MSSQL, Oracle, MySql, v.v.).

Làm cách nào để có được điều này?

Trả lời

18

Trước tiên, bạn nên xác định đại biểu và sau đó sử dụng đại biểu đó để xác định sự kiện đó.

Trong MyUserControl.xaml.cs bạn nộp thêm sau

Lựa chọn 1

public delegate void MyPersonalizedUCEventHandler(string sampleParam); 

    public event MyPersonalizedUCEventHandler MyPersonalizedUCEvent; 

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

Và đó là nó. Bạn đã xác định sự kiện của mình.

Lựa chọn 2

public event Action<String> MyPersonalizedUCEvent; 

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

Thông tin thêm về các Action đại biểu có thể được tìm thấy trong link này.

Lưu ý:

Trong nhiều trường hợp nếu các sự kiện không được sử dụng đúng cách chúng có thể gây rò rỉ bộ nhớ. Chỉ cần đảm bảo rằng bạn đã viết mã để xóa các trình xử lý sự kiện đã đăng ký như được hiển thị bên dưới.

 MyPersonalizedUCEvent -= MyPersonalizedUCEventHandler; 
+3

@davymartu Nhưng thay vì xác định loại đại biểu của riêng bạn, bạn thường sẽ sử dụng một trong những người được xác định trước, như [EventHandler] (http://msdn.microsoft.com/en-us/library/system.eventhandler.aspx) hoặc [EventHandler ] (http://msdn.microsoft.com/en-us/library/db0etb8x. aspx). – Clemens

+0

Tôi đã xác định một sự kiện đơn giản. Tuy nhiên, nếu bạn muốn sự kiện để bong bóng vào thùng chứa cha mẹ bạn nên tạo một sự kiện định tuyến và câu trả lời iltzortz giải thích làm thế nào để tạo ra nó. –

5

Đầu tiên tạo ra một sự kiện nào trong lớp học của bạn:

public event EventHandler<MyEventArgs> SomethingChanged; 

NBMyEventArgs là kiểu của đối tượng đó sẽ được thông qua với sự kiện cho các thuê bao. Ví dụ này nó có thể là như thế này:

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

lửa Tiếp theo nó như nó vốn có trong lớp học của bạn:

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

finnally xử lý nó như thế này:

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

NB Bạn cần đăng ký sự kiện để tham gia phương thức OnSometingChanged.Theo dõi như thế này:

myClass.SomethingChanged+=OnSomethingChanged; 

đâu myClass là một thể hiện của lớp nơi bạn xác định SomethingChanged

Các vấn đề liên quan