C# 使用WhenAny观察集合并为其分配布尔属性帮助的反应UI
我有一个ObservableCollection,其中包含我想要观察的字符串。当第一个索引发生更改时,我希望更新ObservablesPropertyHelper布尔变量,如果该索引处的字符串不为null且不为空,则将其设置为true。或者,将集合转换为包含布尔值的第二个ObservableCollection的方法也可以。C# 使用WhenAny观察集合并为其分配布尔属性帮助的反应UI,c#,list,linq,lambda,reactiveui,C#,List,Linq,Lambda,Reactiveui,我有一个ObservableCollection,其中包含我想要观察的字符串。当第一个索引发生更改时,我希望更新ObservablesPropertyHelper布尔变量,如果该索引处的字符串不为null且不为空,则将其设置为true。或者,将集合转换为包含布尔值的第二个ObservableCollection的方法也可以。 以下是我尝试过的: public ObservableCollection<string> Difficulties { get; set; } public
以下是我尝试过的:
public ObservableCollection<string> Difficulties { get; set; }
public extern bool Easy { [ObservableAsProperty] get; }
public Song()
{
this.WhenAny(x => x.Easy, x => x.GetValue()[0] != null && x.GetValue()[0}]!= "").ToPropertyEx(this, x => x.Easy);
}
我对使用Linq表达式相当陌生,因此解决方案可能很简单(比我尝试的东西简单得多--)顺便说一句,我在.net core 3.0上使用了ReactiveUi.WPF和ReactiveUi.Fody。WhenyValue扩展方法通常用于您希望观察视图模型属性更改的情况,并且在这方面做得非常好。它不是为处理可变集合而设计的,例如
observedcollection
或ReadOnlyObservableCollection
。对于被动收集,请使用库,也请参阅相关的。最新的ReactiveUI版本依赖于DynamicATA,因此您无需安装任何其他软件包
TLDR
T
,则使用whanyvalue
ObservableCollection
的属性,请使用来查看可观察的变更集
[ObservableAsProperty]
公共bool Easy{get;}
公众可观察到的收集困难{get;}
公歌()
{
困难=新的可观察集合();
//观察可观察集合中的任何变化。
//请注意,该属性没有公共setter,因此
//假设集合通过使用Add()进行了变异,
//Delete()、Clear()和其他类似方法。
这是困难
//将集合转换为块流,
//所以我们可以观察到
//类型也称为DynamicDataMonad。
.ToObservableChangeSet(x=>x)
//每次集合更改时,我们都会得到
//一次更新所有项目。
.ToCollection()
//如果集合不为空,则访问
//第一个元素并检查它是否为空字符串。
.选择(项目=>
项目.任何()&&
!string.IsNullOrWhiteSpace(items.First()))
//然后,我们将布尔值转换为
//属性中的第一个字符串
//集合不为空,将设置Easy
//为真,否则为假。
.ToPropertyEx(这个,x=>x.Easy);
}
请注意,如果您使用的是不可变数据集,例如:
[Reactive]公共IEnumerable难点{get;set;}
并且该数据集仅通过其公共setter更新,那么您应该在此处使用WhenAnyValue
扩展方法,因为声明为IEnumerable
的集合是不可见的:
this.whenyValue(x=>x.whenyValue)
.选择(项目=>
项目.任何()&&
!string.IsNullOrWhiteSpace(items.First()))
.ToPropertyEx(这个,x=>x.Easy);
当您希望观察视图模型属性的变化时,通常会使用WhenyValue
扩展方法,并且在这方面做得非常好。它不是为处理可变集合而设计的,例如observedcollection
或ReadOnlyObservableCollection
。对于被动收集,请使用库,也请参阅相关的。最新的ReactiveUI版本依赖于DynamicATA,因此您无需安装任何其他软件包
TLDR
T
,则使用whanyvalue
ObservableCollection
的属性,请使用来查看可观察的变更集
[ObservableAsProperty]
公共bool Easy{get;}
公众可观察到的收集困难{get;}
公歌()
{
困难=新的可观察集合();
//观察可观察集合中的任何变化。
//请注意,该属性没有公共setter,因此
//假设集合通过使用Add()进行了变异,
//Delete()、Clear()和其他类似方法。
这是困难
//将集合转换为块流,
//所以我们可以观察到
//类型也称为DynamicDataMonad。
.ToObservableChangeSet(x=>x)
//每次集合更改时,我们都会得到
//一次更新所有项目。
.ToCollection()
//如果集合不为空,则访问
//第一个元素并检查它是否为空字符串。
.选择(项目=>
项目.任何()&&
!string.IsNullOrWhiteSpace(items.First()))
//然后,我们将布尔值转换为
//属性中的第一个字符串
//集合不为空,将设置Easy
//为真,否则为假。
.ToPropertyEx(这个,x=>x.Easy);
}
请注意,如果您使用的是不可变数据集,例如:
[Reactive]公共IEnumerable难点{get;set;}
并且该数据集仅通过其公共setter更新,那么您应该在此处使用WhenAnyValue
扩展方法,因为声明为IEnumerable
的集合是不可见的:
this.whenyValue(x=>x.whenyValue)
.选择(项目=>
项目.任何()&&
!string.IsNullOrWhiteSpace(items.First()))
.ToPropertyEx(这个,x=>x.Easy);
[Reactive] public string Title { get; set; }
public extern bool Enabled { [ObservableAsProperty] get; }
public Song()
{
this.WhenAny(x => x.Title, x => x.GetValue() != null && x.GetValue() != "").ToPropertyEx(this, x => x.Enabled);
}