C# 反应UI中的等价性?

C# 反应UI中的等价性?,c#,.net,system.reactive,reactiveui,C#,.net,System.reactive,Reactiveui,我在一个反应对象中有这个属性: bool IsValid => Children.All(child => child.IsValid); 当然,问题是,当修改子对象(其“IsValid”属性)时,它不会发出任何更改通知 如何在ReactiveUI中以正确的方式完成此操作 注意: Child也是一个反应对象 我可以修改这两个类,家长 和儿童,以满足RxUI戒律和指导方针,无需 限制 ObservablesProperty帮助是您所需要的,如果您的子属性是一个被动列表,您可以合并已

我在一个反应对象中有这个属性

bool IsValid => Children.All(child => child.IsValid);
当然,问题是,当修改子对象(其“IsValid”属性)时,它不会发出任何更改通知

如何在ReactiveUI中以正确的方式完成此操作

注意:

  • Child也是一个反应对象
  • 我可以修改这两个类,家长 和儿童,以满足RxUI戒律和指导方针,无需 限制
ObservablesProperty帮助是您所需要的,如果您的子属性是一个被动列表,您可以合并已更改的和项目已更改的可观察对象,并具有如下功能:

public class MyViewModel : ReactiveObject
    {
        private readonly ObservableAsPropertyHelper<bool> _isValidPropertyHelper;

        public MyViewModel()
        {
            var listChanged = Children.Changed.Select(_ => Unit.Default);
            var childrenChanged = Children.ItemChanged.Select(_ => Unit.Default);
            _isValidPropertyHelper = listChanged.Merge(childrenChanged)
                                                .Select(_ => Children.All(c => c.IsValid))
                                                .ToProperty(this, model => model.IsValid);

        }
        public bool IsValid
        {
            get { return _isValidPropertyHelper.Value; }
        }

        public ReactiveList<Item> Children { get; set; }
    }
公共类MyViewModel:ReactiveObject
{
私有只读ObservablesPropertyHelper\u isValidPropertyHelper;
公共MyViewModel()
{
var listChanged=Children.Changed.Select(=>Unit.Default);
var childrenChanged=Children.ItemChanged.Select(=>Unit.Default);
_isValidPropertyHelper=listChanged.Merge(childrenChanged)
.Select(=>Children.All(c=>c.IsValid))
.ToProperty(此,model=>model.IsValid);
}
公共布尔是有效的
{
获取{return}isValidPropertyHelper.Value;}
}
公共反应列表子项{get;set;}
}
ObservablesPropertyHelper是您所需要的,如果您的子属性是一个被动列表,您可以合并更改的和项目更改的observables,并具有如下功能:

public class MyViewModel : ReactiveObject
    {
        private readonly ObservableAsPropertyHelper<bool> _isValidPropertyHelper;

        public MyViewModel()
        {
            var listChanged = Children.Changed.Select(_ => Unit.Default);
            var childrenChanged = Children.ItemChanged.Select(_ => Unit.Default);
            _isValidPropertyHelper = listChanged.Merge(childrenChanged)
                                                .Select(_ => Children.All(c => c.IsValid))
                                                .ToProperty(this, model => model.IsValid);

        }
        public bool IsValid
        {
            get { return _isValidPropertyHelper.Value; }
        }

        public ReactiveList<Item> Children { get; set; }
    }
公共类MyViewModel:ReactiveObject
{
私有只读ObservablesPropertyHelper\u isValidPropertyHelper;
公共MyViewModel()
{
var listChanged=Children.Changed.Select(=>Unit.Default);
var childrenChanged=Children.ItemChanged.Select(=>Unit.Default);
_isValidPropertyHelper=listChanged.Merge(childrenChanged)
.Select(=>Children.All(c=>c.IsValid))
.ToProperty(此,model=>model.IsValid);
}
公共布尔是有效的
{
获取{return}isValidPropertyHelper.Value;}
}
公共反应列表子项{get;set;}
}

是否执行
child.IsValid
raise
PropertyChanged
events?child是一个反应对象。我可以自由地为它建模。如何将更改从子项传播到父项?我想做的语义是:“如果我的孩子是有效的,我就是有效的。”Does
child.IsValid
raise
PropertyChanged
events?child是一个反应对象。我可以自由地为它建模。如何将更改从子项传播到父项?我想做的语义是:“如果我的孩子是有效的,我就是有效的。”这假设OP只想在添加/删除/替换孩子时更新
MyViewModel.IsValid
,而不是在
child.IsValid
更改时更新。我不确定这是否是他的意图。@ds-b很抱歉,但我觉得你的回答不起作用:(我认为如果Children是一个
反应列表
,您需要设置
Children.changetrackingabled=true
,这样才能起作用。这假设OP想更新
MyViewModel.IsValid
只有在添加/删除/替换一个Children时才有效,而不是在
Children.IsValid
更改时。我不确定这是否是他的意图。@ds-b我很高兴。)rry,但我觉得你的答案不起作用:(我认为如果Children是一个
反应列表
,你需要设置
Children.ChangeTrackingEnabled=true
,这样才能起作用。