gpt4 book ai didi

c# - ReactiveList 问题

转载 作者:行者123 更新时间:2023-11-30 16:11:46 42 4
gpt4 key购买 nike

我们是 ReactiveUI 的新手,所以这可以解释为什么我们在让 View 模型工作时遇到一些问题。

在我们的 View 模型中,我们有一个类的 ReactiveList,类中有一个“已选择”。

在 View 模型中,我们希望有一个“AnySelected”属性,这样如果列表中至少有一项标记为选中,则 AnySelected 为真。

我们很难完成这项工作。

作为一个只有字符串的小型测试应用程序,我们已经尝试过了,但是没有出现关于发生变化的消息。

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. 列表项改变
  3. 任何项目的“Selected”属性都会发生变化。请记住,您要观看的项目会因#1 或#2 而改变。

我该怎么做?

这是一种方法。这很复杂,这暗示了 future 版本的 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 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24044111/

42 4 0