コードビハインドで Livet の EventListener を使ってみる

必要に迫られてちょっと考えてみました。しかしイベントの登録・解除・アクションの指定を集中管理できるので、いい感じです。

using Livet;
using Livet.EventListeners;
using System;
using System.Windows;

namespace LivetWPFApplication5.Views {
    public partial class MainWindow : Window {

        private LivetCompositeDisposable _compositeDisposable;

        public MainWindow() {
            InitializeComponent();
            _compositeDisposable = new LivetCompositeDisposable();

            var listener = new EventListener<RoutedEventHandler>(
                h => button.Click += h,
                h => button.Click -= h,
                (sender, e) => {test(); } );
            _compositeDisposable.Add(listener);
        }

        protected override void OnClosed(EventArgs e) {
            _compositeDisposable.Dispose();
            base.OnClosed(e);
        }

        private void test() {
            MessageBox.Show("OK");
        }
    }
}


なんでこんな実装に考えてるのかというと、XamDataGrid のイベントを管理したいためなんですよね〜。ただし VB の場合、AddHandler や AddressOf がどうにも美しくなくていやん><

Option Explicit On
Option Strict On

Imports Infragistics.Windows
Imports Infragistics.Windows.Controls
Imports Infragistics.Windows.DataPresenter
Imports Infragistics.Windows.DataPresenter.Events
Imports Livet

Public Class MainWindow
    Private _compositeDisposable As LivetCompositeDisposable

    Public Sub New()
        InitializeComponent()
        Me.AddListeners()
    End Sub

    Protected Overrides Sub OnClosed(e As EventArgs)
        _compositeDisposable.Dispose()
        MyBase.OnClosed(e)
    End Sub

    Private Sub AddListeners()
        _compositeDisposable = New LivetCompositeDisposable()

        _compositeDisposable.Add(
            New EventListener(Of EventHandler(Of EditModeEndedEventArgs))(
                Sub() AddHandler Me.XamDataGrid1.EditModeEnded, AddressOf OnEditModeEnded,
                Sub() RemoveHandler Me.XamDataGrid1.EditModeEnded, AddressOf OnEditModeEnded,
                AddressOf OnEditModeEnded))

        _compositeDisposable.Add(
            New EventListener(Of EventHandler(Of EditModeStartingEventArgs))(
                Sub() AddHandler Me.XamDataGrid1.EditModeStarting, AddressOf OnEditModeStarting,
                Sub() RemoveHandler Me.XamDataGrid1.EditModeStarting, AddressOf OnEditModeStarting,
                AddressOf OnEditModeStarting))

        _compositeDisposable.Add(
            New EventListener(Of EventHandler(Of FieldChooserOpeningEventArgs))(
                Sub() AddHandler Me.XamDataGrid1.FieldChooserOpening, AddressOf OnFieldChooserOpening,
                Sub() RemoveHandler Me.XamDataGrid1.FieldChooserOpening, AddressOf OnFieldChooserOpening,
                AddressOf OnFieldChooserOpening))

        _compositeDisposable.Add(
            New EventListener(Of EventHandler(Of RecordFilterChangedEventArgs))(
                Sub() AddHandler Me.XamDataGrid1.RecordFilterChanged, AddressOf OnRecordFilterChanged,
                Sub() RemoveHandler Me.XamDataGrid1.RecordFilterChanged, AddressOf OnRecordFilterChanged,
                AddressOf OnRecordFilterChanged))

        ' ・・・・・・・・・・・・
    End Sub

    ' ・・・・・・以降略・・・・・・

End Class