2

私は reactui を試していますが、単純なシナリオを機能させる方法がわかりません: チャット ルームでメッセージをリッスンする方法があります。そのため、長時間実行され、メッセージが見つかったときにイベントが発生します。

反応UIを使用して、ウィンドウが開いたときにこの長時間実行されるメソッドを開始し、リストボックスの画面に新しいメッセージを入力したいと考えています。私は rx を使用しているため、長時間実行されるメソッドの IObseravble バージョンが必要になると想定したため、次のようなものを作成しました。

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

しかし、これをreactiveuiに組み込む方法がわかりません。必要ObservableAsPropertyHelper<List<Message>>ですか?現時点では、実行時間の長いメソッドを aTask.Factory.Startnewで開始し、イベントが発生すると、フロント エンドのリスト ボックスにバインドされているメッセージのリストに手動で追加します。これは機能しますが、reactiveuiを使用していません。これを行うにはreactiveuiの方法が必要だと思います:

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 に答える