web-dev-qa-db-ja.com

カスタム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など)にこれが必要です。

これを取得する方法?

16
davymartu

最初にデリゲートを定義し、次にそのデリゲートを使用してそのイベントを定義する必要があります。

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;
26
Anand Murali

まず、クラスで公開イベントを作成します。

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を定義するクラスのインスタンスです。

10
Marc_Alx