2014-01-25 1 views
3

Я использую инфраструктуру ReactiveUI для поиска списка аэропортов в мире.ReactiveUI/Reactive Extensions: как очистить ObservableAsPropertyHelper

Я установил ObservableAsPropertyHelper, который является выходом предлагаемых аэропортов из свойства SearchTerm в ViewModel. Ниже приведено определение для ObservableAsPropertyHelper. В представлении у меня есть список, который привязывается к этому свойству. Я хотел бы иметь возможность очистить список явно (потому что, как только пользователь выбрал предлагаемый элемент, я хочу заполнить SearchTerm выбранным аэропортом и удалить предложенный список). Есть ли элегантный способ реализовать это?

var searchTerms = this.ObservableForProperty(x => x.SearchTerms).Where(x => canSearch).Value().Throttle(TimeSpan.FromMilliseconds(500)); 
var searchResults = searchTerms.SelectMany(SearchAirports); 
var latestResults = searchTerms.CombineLatest(searchResults, (s, r) => r.SearchTerm != s ? null : r.AirportLiteWithWeights).Where(x => x != null); 
_airportLiteWithWeights = latestResults.ToProperty(this, x => x.AirportLiteWithWeights); 

ответ

2

Вот как я бы это сделать - это немного сложно, потому что фактическая последовательность событий передает обратно в себя (т.е. выбора пункта устанавливает SearchTerms)

// The act of selecting an item is very ICommand'y, let's model it 
// as such. 
ReactiveCommand SuggestionItemSelected = new ReactiveCommand(); 

// Important to *not* signal a change here by touching the field 
// so that we avoid a circular event chain 
SuggestionItemSelected.Subscribe(x => _searchTerms = x); 

// NB: Always provide a scheduler to Throttle! 
var searchTerms = this.WhenAnyValue(x => x.SearchTerms) 
    .Where(x => canSearch) 
    .Throttle(TimeSpan.FromMilliseconds(500), RxApp.MainThreadScheduler); 

// Select + Switch will do what you were trying to do with CombineLatest 
var latestResults = searchTerms 
    .Select(SearchAirports); 
    .Switch() 

// The listbox is the combination of *Either* the latest results, or the 
// empty list if someone chooses an item 
var latestResultsOrCleared = Observable.Merge(
    latestResults, 
    SuggestionItemSelected.Select(_ => new List<Results>())); 

latestResultsOrCleared 
    .ToProperty(this, x => x.AirportLiteWithWeights, out _airportLiteWithWeights); 
+0

благодарит Поль! , но _searchTerms = x не обновляет пользовательский интерфейс. btw .. Я узнал что-то новое сегодня. метод Switch() действительно подходит в этой ситуации! благодаря! – icube

+0

Спасибо, Пол, я смог использовать это решение. Однако я использую RxUI 7 и использую по существу пустую команду для ее реализации. Есть ли более элегантное решение с этой версией, не существует ReactiveCommand.Create(); поэтому я использую this.CancelCommand = ReactiveCommand.Create (() => {}); – Saxar