避免后的ireactiveDerivedListlist被打破



当我使用ReactiveListIReactiveDerivedList创建一个ViewModel时,然后使用JSON.NET序列化并进行序列化时,派生列表似乎被打破了。我在做什么错?

ViewModel:

[DataContract]
public class TestViewModel : ReactiveObject
{
    [DataMember]
    public ReactiveList<int> List { get; } = new ReactiveList<int>();
    public IReactiveDerivedList<int> DerivedList { get; }
    public TestViewModel()
    {
        //DerivedList contains all elements of List that are greater than 0.
        DerivedList = List.CreateDerivedCollection(v => v, v => v > 0);
    }
}

序列化测试:

private void Example()
{
    TestViewModel vm = new TestViewModel();
    vm.List.Add(0);
    vm.List.Add(1);
    //vm.DerivedList now has 1 item
    string json = JsonConvert.SerializeObject(vm);
    TestViewModel clone = JsonConvert.DeserializeObject<TestViewModel>(json);
    //vm.DerivedList now has 1 item
    //clone.DerivedList now has 1 item
    vm.List.Add(1);
    clone.List.Add(1);
    //vm.DerivedList now has 2 items
    //clone.DerivedList now has 1 item
}

我认为,这里的问题是,当ViewModel被挑选时,用作派生列表的源的重新分散者也被估算,这就是问题所在的地方。

当您的testViewModel被要求化时,事件的顺序是这样的:

  • 重新分配构造函数运行。这设置了可观察到的后退字段。
  • TestViewModel构造函数运行。这设置了派生的集合,该集合订阅了重新分散的观测值。
  • 重新分散的" ondeSerialized"回调运行。这再次设置了可观察到的备份字段,覆盖其先前的值。

最后一步是问题发生的地方。派生的集合订阅了 old 可观察到的,而不是重新分散者现在正在使用的集合。修复它的一种方法是给派生的列表属性一个私人设置器,实现避风式回调,然后在该回调中创建派生列表。

[DataContract]
public class TestViewModel : ReactiveObject
{
    [DataMember]
    public ReactiveList<int> List { get; } = new ReactiveList<int>();
    public IReactiveDerivedList<int> DerivedList { get; private set; }
    public TestViewModel()
    {
        SetupRx();
    }
    [OnDeserialized]
    internal void OnDeserialized(StreamingContext context)
    {
        SetupRx();
    }
    private void SetupRx()
    {
        DerivedList?.Dispose();
        DerivedList = List.CreateDerivedCollection(v => v, v => v > 0);
    }
}

相关内容

  • 没有找到相关文章

最新更新