2

我正在尝试响应式,但我不明白如何使一个简单的场景工作:我有一个在聊天室中侦听消息的方法。因此,它运行时间很长,并在找到消息时触发事件。

使用reactiveui,我想在窗口打开时启动这个长时间运行的方法,并在列表框中的屏幕上填充新消息。因为我使用的是 rx,所以我认为我需要一个长期运行方法的 IObseravble 版本,所以我做了一个这样的:

    public static IObservable<Message> ObservableStream(int roomid, CancellationToken token)
    {
        return Observable.Create<Message>(
            async (IObserver<Message> observer) =>
                {
                 ...
                }
         );
    }

但是,我不知道如何将其与反应式联系起来。我需要一个ObservableAsPropertyHelper<List<Message>>吗?目前,我只是在 a 中启动长时间运行的方法,Task.Factory.Startnew然后在事件中手动添加到消息列表中,该列表绑定到前端列表框。这行得通,但它没有使用任何反应式用户界面,我觉得应该有一种反应式用户界面方法来做到这一点:

public class MainWindowViewModel : ReactiveObject
{
    private ThreadSafeObservableCollection<Message> _Messages;
    public ThreadSafeObservableCollection<Message> Messages
    {
        get { return _Messages; }
        set { 
            this.RaiseAndSetIfChanged(x => x._Messages, value);
        }
    }


    public MainWindowViewModel()
    {
        Client.NewMessage += (sender, args) => Messages.Add(args.Message);
        var task = Task.Factory.StartNew(() => Client.GetStream(token), token, TaskCreationOptions.LongRunning, TaskScheduler.Current);

    }
}


// IN the code-behind

this.OneWayBind(ViewModel, x => x.Messages, x => x.MessageList.ItemsSource);
4

1 回答 1

2

怎么样:

var Messages = ObservableStream(...).CreateCollection();

然后,您可以收听ItemAdded等人的消息,或者只是通过绑定它OneWayBind,UI 将自动更新。

我需要一个 ObservableAsPropertyHelper> 吗?

因此,通常这对于大多数 Web API 调用来说都是一个好主意,但是由于您是在流式传输列表而不是每次都替换列表,因此您需要在启动时创建一个集合并在项目进入时向其中添加项目。另一个你可以这样做的方法是:

var Messages = new ReactiveList<Message>();
ObservableStream(...).ObserveOn(RxApp.MainThreadScheduler).Subscribe(x => Message.Add(x));
于 2013-07-03T18:21:33.843 回答