差分

ナビゲーションに移動 検索に移動

ReactiveUI/Xamarin.MacのNSTextFieldにバインドする

2,871 バイト追加, 2015年3月9日 (月) 11:14
ページの作成:「ReactiveUIのビューモデルをXamarin.MacのNSTextFieldにバインドする場合には一筋縄ではいなかいようだ。 単純にReactiveWindowController...」
ReactiveUIのビューモデルを[[Xamarin.Mac]]のNSTextFieldにバインドする場合には一筋縄ではいなかいようだ。
単純にReactiveWindowControllerクラスのBindメソッドやOneWayBindメソッドでバインドしただけではまったく反応してくれなくて困った。
そんな中[[キーボード]]を強打しながら[[GitHub]]を徘徊していたところ見事に解決策を発見した<ref>https://github.com/reactiveui/RxUI_QCon/blob/master/RxUI_QCon.Cocoa/MainWindowController.cs</ref>。
<source lang="csharp">
using System;
using System.ComponentModel;
using System.Reactive;
using System.Reactive.Concurrency;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using Foundation;
using AppKit;
using ReactiveUI;

public partial class MainWindowController : ReactiveWindowController, IViewFor<MainViewModel>
{
// 〜〜〜中略〜〜〜

MainViewModel _viewModel;

public MainViewModel ViewModel {
get { return _viewModel; }
set { this.RaiseAndSetIfChanged(ref _viewModel, value); }
}

object IViewFor.ViewModel
{
get { return ViewModel; }
set { ViewModel = (MainViewModel)value; }
}

// 〜〜〜ここまではよくある定型〜〜〜

IObservable<Unit> hookTextField(NSTextField textField)
{
var ret = new Subject<Unit>();
textField.Delegate = new BlockDidChangeTextFieldDelegate(() => ret.OnNext(Unit.Default));
return ret;
}

class BlockDidChangeTextFieldDelegate : NSTextFieldDelegate
{
Action block;
public BlockDidChangeTextFieldDelegate(Action block) { this.block = block; }
public override void Changed(NSNotification notification) { block(); }
}

public override void WindowDidLoad()
{
base.WindowDidLoad();

// ---- バインド ----

// よくあるこの記法では動かない
//this.Bind(ViewModel, vm => vm.FirstName, v => v.FirstName.StringValue);

// hookTextFieldが重要だった
this.Bind(ViewModel, vm => vm.FirstName, v => v.FirstName.StringValue, hookTextField(FirstName));
this.Bind(ViewModel, vm => vm.LastName , v => v.LastName.StringValue , hookTextField(LastName));
this.OneWayBind(ViewModel, vm => vm.FullName, v => v.FullName.StringValue);

// ---- ビューモデル生成 ----
ViewModel = new MainViewModel();
}
}
</source>
なお、このサンプルのビューモデルには「[[ReactiveUI/ViewModelを作る#WhenAny]]」にあるものを使っている。

==関連項目==
*[[ReactiveUI]]

==参考文献==
{{reflist}}

{{stub}}
匿名利用者

案内メニュー