private static void StartEditing(ListView list, ListViewItem item, DocumentGroup group, Action <TextBox, bool> endEditingFn) { var edit = item.FindDescendant <TextBox>(); var visibility = Observable.FromEventPattern <DependencyPropertyChangedEventArgs>(edit, "IsVisibleChanged"); var disposables = new CompositeDisposable(); visibility.Where(re => re.EventArgs.NewValue as bool? == false) .Take(1) .Subscribe(re => disposables.Dispose()); visibility.Where(ivc => ivc.EventArgs.NewValue as bool? == true) .Take(1) .Subscribe(re => { edit.SelectionStart = 0; edit.SelectionLength = edit.Text.Length; edit.Focus(); }); disposables.Add(Observable.FromEventPattern <RoutedEventArgs>(edit, "LostFocus") .Take(1) .Subscribe(re => endEditingFn(edit, false))); disposables.Add(Observable.FromEventPattern <KeyEventArgs>(edit, "PreviewKeyUp") .Where(re => re.EventArgs.Key == Key.Escape || re.EventArgs.Key == Key.Enter) .Take(1) .Subscribe(re => { re.EventArgs.Handled = true; endEditingFn(edit, re.EventArgs.Key == Key.Escape); })); disposables.Add(Observable.FromEventPattern <MouseEventArgs>(list, "MouseLeftButtonDown") .Take(1) .Subscribe(re => endEditingFn(edit, false))); group.StartEditing(); }