首页 / REACT / C#-ReactiveList问题
C#-ReactiveList问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-ReactiveList问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2693字,纯文字阅读大概需要4分钟。
内容图文
我们对ReactiveUI相对较新,因此这可以解释为什么我们在使视图模型正常工作时遇到一些问题.
在我们的视图模型中,我们有一个类的ReactiveList,在该类中有一个“ selected”的.
在视图模型中,我们希望有一个“ AnySelected”属性,这样,如果列表中至少有1个项目标记为选中,则AnySelected为true.
我们很难完成这项工作.
作为一个只有字符串的小型测试应用程序,我们已经尝试过了,但是没有出现有关更改发生的消息.
public class TestRx : ReactiveObject
{
private ReactiveList<string> mySelectedItems;
public ReactiveList<string> MySelectedItems
{
get { return mySelectedItems; }
set { this.RaiseAndSetIfChanged(ref mySelectedItems, value); }
}
public TestRx()
{
var firstList = new ReactiveList<string>();
var t = this.WhenAnyValue(x => x.MySelectedItems);
var t1 = t.Select(x => x ?? new ReactiveList<string>());
var changed = t1.Select(x => x.Changed.Select(_ => Unit.Default));
var itemChanged = t1.Select(x => x.ItemChanged.Select(_ => Unit.Default));
var countChanged = t1.Select(x => x.CountChanged.Select(_ => Unit.Default));
t.Subscribe(x => Debug.WriteLine("T HAS CHANGED {0}", x == firstList));
t1.Subscribe(z => Debug.WriteLine("T1 Changed {0}", z == firstList));
changed.Subscribe(x => Debug.WriteLine("Changed :"));
itemChanged.Subscribe(x => Debug.WriteLine("Item Changed :"));
var replacementList = new ReactiveList<SelItem>(new[] {
new SelItem() { Selected = false }
});
Debug.WriteLine("***********************Assign 1st list");
MySelectedItems = firstList;
Thread.Sleep(100);
Debug.WriteLine("***********************Adding item 2 list");
MySelectedItems.Add("a new string");
// we don't get any debug messages as a result of the above
Thread.Sleep(100);
Debug.WriteLine("***********************Assign null");
MySelectedItems = null;
Thread.Sleep(100);
}
}
我们做错了什么?
解决方法:
这是一种常见的模式,但是实现起来有些棘手,因为您必须处理以下所有情况:
>清单已设定
>列表项更改
>任何项目上的“选定”属性都会更改.请记住,您要观看的物品因#1或#2而改变.
我该怎么做?
这是一种方法.这很复杂,这暗示着将来的RxUI版本可以使事情变得更好的地方,但是这是您现在可以做的.
IObservable<bool> WhenAnyAreTrue(IEnumerable<ViewModel> currentElements)
{
// NB: 'Unit' here means, we don't care about the actual value, just
// that something changed
var notifyWhenAnySelectedItemChanges = currentElements
.Select(x => x.WhenAny(y => y.Selected, _ => Unit.Default).Skip(1))
.Merge();
return notifyWhenAnySelectedItemChanges
.StartWith(Unit.Default)
.Select(_ => currentElements.Any(x => x.Selected));
}
// Any time MySelectedItems change or when the items in it change,
// create a new WhenAnyAreTrue and switch to it
this.WhenAnyObservable(x => x.MySelectedItems.ItemsChanged)
.Select(_ => WhenAnyAreTrue(MySelectedItems))
.Switch()
.ToProperty(this, x => x.AnySelected, out anySelected);
内容总结
以上是互联网集市为您收集整理的C#-ReactiveList问题全部内容,希望文章能够帮你解决C#-ReactiveList问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。