2013-12-19 6 views
0

Я довольно новичок в реактивном интерфейсе. Я использую его в своем приложении для асинхронного программирования и т. Д.Связь между представлением и представлением модели с использованием ReactiveUI.NET

У меня есть вопрос. У меня есть метод в моей ViewModel, который является асинхронным и который «ждет» для выполнения задачи. По завершении этой задачи я хотел бы уведомить о своем представлении (UserControl), чтобы он мог динамически добавлять еще несколько контента/UserControls, например DockPanel.

Каков наилучший способ сделать это с помощью ReactiveUI или RX? Я мог бы использовать механизм событий C# и т. Д., Но я хочу продолжить путь RX. Я установил свойство boolena в моей виртуальной машине, когда метод async «завершил» (т. Е. Вернулся с ожиданием).

Я хочу наблюдать за этим логическим свойством (определенным в моей виртуальной машине) в моем «представлении» .. поэтому я могу прикрепить обработчик в моем «представлении», который будет динамически создавать некоторые UserControls, например.

this.viewModel.ObservableForProperty(x => x.DataLoaded) 
       .Subscribe(async _ => await this.MyViewHandler()); 
// this does not compile as the delegate is not IObserver type in my view it says 

Любое руководство будет очень признательно, большое спасибо.

ответ

2

Вы в основном получили правильное представление, просто нужна работа по синтаксису:

this.WhenAnyValue(x => x.ViewModel.DataLoaded) 
    .Where(x => x == true) 
    .Subscribe(_ => MyViewHandler()); 
+0

Спасибо Пол за ваш очень быстрый ответ. Спасибо за jnovo тоже. Думаю, он давал мне альтернативные способы делать вещи, используя Rx или TPL, но я скорее сделаю это ReactiveUI, если это возможно. Я думаю, что я попробовал что-то вроде WhenAnyValue из моего представления (которое получено из Usercontrol), но компилятору это не понравилось. поэтому код выше, будет ли это отображаться? – nDev

+0

Да, это было бы в представлении - если компилятор ему не нравится, может быть, вам не хватает инструкции «using»? Или вы используете более старую версию RxUI? –

+0

Привет, Пол, я уверен, что у меня есть инструкция «using» для ссылки на правильное пространство имен. Думаю, я использую ver 4.4.6. – nDev

0

Проблема с вашим примером кода заключается в том, что, как компилятор говорит, вы не передаете действительную реализацию IObserver в метод Subscribe. Вы фактически передаете Func<boolean, Task>, где он ожидает Action<boolean>, реализующий IObserver.OnNext.

Я не пробовал ReactiveUI, но думаю, что вы можете выполнить, но вы намереваетесь либо с Task Continuation, либо с IObserver.OnCompleted. Идея состоит в следующем:

  • Использование задачи Продолжение, вы должны запустить другую задачу, как только вы упомянули, что закончили. Вы можете сделать это, добавив вызов .ContinueWith к своей задаче. Имейте в виду, что код из задачи продолжения, изменяющей пользовательский интерфейс, должен быть отправлен в поток пользовательского интерфейса из задачи продолжения (либо с использованием Dispatcher, либо путем передачи правильного TaskScheduler в ContinueWith).

  • С RX, вы можете создать последовательность для вашей задачи с правильным методом Observable.Create фабрики или просто используя Task.ToObservable методы расширения, а затем подписаться на него и делать все, что вы хотите на OnCompleted обработчика.

+0

Я не хочу быть резким, но если вы еще не пробовали ReactiveUI, почему бы вам ответить на вопрос об этом? Этот ответ почти полностью неверен. –

+1

@PaulBetts не было принято никакого нарушения, с моей точки зрения он спросил об ReactiveUI или RX, поэтому я попытался помочь с RX plus, давая подсказку о TPL. Я с удовольствием удалю его, если он не применим. Теперь, если вы укажете мне, что неправильно, я могу попытаться это исправить. – jnovo

Смежные вопросы