ReactiveUI RaiseAndSetIfChanged是否为List <t>添加,删除,修改?</t>

时间:2013-12-01 18:30:58

标签: c# reactiveui

这会不会发生火灾

private List<TweetTileViewModel> _TweetTiles;
    public List<TweetTileViewModel> TweetTiles
    {
        get { return _TweetTiles; }
        set { this.RaiseAndSetIfChanged(ref _TweetTiles, value); }
    }

当我这样做时:

TweetTiles.Add(new TweetTileViewModel(...)); or
TweetTiles.Remove(new TweetTileViewModel(...));

我怀疑没有,但我不确定我应该如何得到这种行为。

我有一个在后台任务上运行的函数,它正在返回推文。每次我收到一条新推文时,我都会将其转换为TweetTileViewModel,并希望它显示在我的UI列表框中。

1 个答案:

答案 0 :(得分:1)

  

这会引发火灾吗?

不,这只会在您设置列表时触发:

TweetTiles = new List<TweetTileViewModel>();
  

我有一个在后台任务上运行的函数,它正在返回推文。每次我收到一条新推文时,我都会将其转换为TweetTileViewModel,并希望它显示在我的UI列表框中。

ReactiveUI通过ReactiveList类对此进行了内置支持。以下是您要如何设置它 - 首先,声明一些属性:

ReactiveList<Tweet> Tweets { get; protected set; }
IReactiveDerivedList<TweetTileViewModel> TweetViewModels { get; protected set; }

ReactiveCommand LoadTweets { get; protected set; }

然后,在构造函数中:

// Note: Only change this list on the UI thread!
Tweets = new ReactiveList<Tweet>();

// Now, TweetViewModels will "follow around" Tweets as you add and remove items
TweetViewModels = Tweets.CreateDerivedCollection(
    tweet => new TweetTileViewModel(tweet));

LoadTweets = new ReactiveCommand();

var newTweets = LoadTweets.RegisterAsyncTask(async _ => {
    // Loads the latest tweets
    return LoadTweetsAsync();
});

newTweets.Subscribe(newTweets => {
    // Add in the new tweets we downloaded. This is guaranteed by
    // ReactiveCommand to be on the UI thread
    Tweets.AddRange(newTweets);
});

更新:修正了类型错误。要使用仅发送回调的方法,请使用AsyncSubject:

public IObservable<List<Tweet>> GetTweetsObservable(this TwitterClient This)
{
    var ret = new AsyncSubject<List<Tweet>>();

    try {
        This.GetTweetsWithCallback(tweets => {
            ret.OnNext(tweets);
            ret.OnCompleted();
        });
    } catch (Exception ex) {
        ret.OnError(ex);
    }

    return ret;
}

现在,您可以将RegisterAsyncTask更改为RegisterAsync,您就可以了!