コードビハインドで 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