質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

3242閲覧

ReactiveExtensionsでコレクションの各アイテムから発行されるイベントを購読したい

mikupedia

総合スコア159

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2017/09/08 17:30

編集2017/09/08 17:32

###前提・実現したいこと
ReactiveExtensionsでコレクションの各アイテムから発行されるイベントを購読したいです。

意味のないコードですが、こんな感じです。

VB.net

1Public Class ItemMember 2 Public Event SomethingEvent As EventHandler 3 Public Sub DoSomething(e As EventArgs) 4 RaiseEvent OnSomething(Me, e) 5 End Sub 6 Protected Sub OnSomething(e As EventArgs) 7 RaiseEvent SomethingEvent(Me, e) 8 End Sub 9End Public 10 11Public Class Person 12 Public ReadOnly Property Items As ObservableCollection(Of ItemMember) 13 Public Sub New() 14 Items = New ObservableCollection(Of ItemMember) 15 Items.Add(new ItemMember) 16 'ここでコレクションアイテムのイベントを購読 17 Observable.FromEvent(Of EventHandler, EventArgs)( ・・・ ).Subscribe() 18 ' 19 Items.First.DoSomething(new EventArgs) 20 End Sub 21End Public

###試したこと
ReactivePropertyのPropertyChangedAsObservable拡張メソッドが
PropertyChangedEventHandlerを購読するような感じでこれをEventHandlerとすればよいのかな考えています。
リンク内容

C#

1/// <summary>Converts PropertyChanged to an observable sequence.</summary> 2public static IObservable<PropertyChangedEventArgs> PropertyChangedAsObservable<T>(this T subject) 3 where T : INotifyPropertyChanged => 4 Observable.FromEvent<PropertyChangedEventHandler, PropertyChangedEventArgs>( 5 h => (sender, e) => h(e), 6 h => subject.PropertyChanged += h, 7 h => subject.PropertyChanged -= h);

公開されているソースコードはC#なのですが、これをVBに置き換えたいです。
変換サービスを使用してみましたが正しく変換されませんでした。
h => subject.PropertyChanged += h のあたりがVBに置き換えるとどうなるのかわかりません。
なのでここで行き詰ってしまいました。

###補足情報(言語/FW/ツール等のバージョンなど)
VisualStudio2015(VB)
ReactiveExtensions
ReactiveProperty

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

とりあえず、やりたいことができたので自己回答します。

ObservableCollection(Of Item)のメンバIsSelectedの値を変更するとイベントが発行されます。
そのイベントをFromEventPatternで購読してなにか処理すればOKです。
ObservableCollectionの項目変更に対する対応はReactivePropertyのObserveElementCoreメソッドを
参考にしました(というか丸写しです。
※SubscribeをDisposeしていませんが、不要になったタイミングでDisposeしてください。

詳細は下記を参照してください。
INotifyCollectionChangedExtensions.cs

VB.net

1public Class Item 2 Public Event SelectedChanged As EventHandler 3 Public Property IsSelected As Boolean 4 Get 5 return _IsSelected 6 End Get 7 Set(value As Boolean) 8 _IsSelected = value 9 OnSelectedChanged() 10 End Set 11 End Property 12 Private _IsSelected As Boolean 13 Private Sub OnSelectedChanged() 14 RaiseEvent SelectedChanged(Me, New EventArgs) 15 End Sub 16End Class 17 18public Class Sample 19 Public Property Items As ObservableCollection(Of Item) 20 Public Sub New() 21 Items = New ObservableCollection(Of Item) 22 Items.Add(New Item) 23 Items.Add(New Item) 24 Items.Add(New Item) 25 ObserveElementCore(Of ObservableCollection(Of Item), Item, EventArgs)( 26 Items, 27 Function(x, observer) 28 Return Observable.FromEventPattern(Of EventHandler, EventArgs)( 29 Function(h) AddressOf h.Invoke, 30 Sub(h) AddHandler x.SelectedChanged, h, 31 Sub(h) RemoveHandler x.SelectedChanged, h). 32 Select(Function(y) y.EventArgs). 33 Subscribe(Sub(y) observer.OnNext(y)) 34 End Function). 35 Subscribe(Sub(y) 36 'イベントを受信したときの処理 37 End Sub) 38 'イベント発行される 39 Items(0).IsSelected = True 40 'イベント発行される 41 Items(1).IsSelected = True 42 'イベント発行される 43 Items(2).IsSelected = True 44 End Sub 45End Class

あとはEventInfoとかリフレクションを駆使すれば拡張メソッド化できるような気がしますが・・・
まだ理解できていません。
方法 : リフレクションを使用してデリゲートをフックする
EventInfoを使ってイベントの発行を行う

投稿2017/09/21 06:09

編集2017/09/21 06:19
mikupedia

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

てすとはしてませんが、下記の様になると思います。
subject.PropertyChanged += hは、AddHandler subject.PropertyChanged,AddressOf h
subject.PropertyChanged -= hは、RemoveHandler subject.PropertyChanged, AddressOf h

詳しくは
https://dobon.net/vb/dotnet/beginner/eventhandle.html
を参照してもらえると理解しやすいと思います。

投稿2017/09/12 04:53

toro1

総合スコア90

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikupedia

2017/09/21 06:16

toro1 様 ご回答ありがとうございました。 AddHandler/RemoveHandlerについてはわかりましたが、今回やりたいこととマッチしませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問