Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用WhenAny观察集合并为其分配布尔属性帮助的反应UI_C#_List_Linq_Lambda_Reactiveui - Fatal编程技术网

C# 使用WhenAny观察集合并为其分配布尔属性帮助的反应UI

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

我有一个ObservableCollection,其中包含我想要观察的字符串。当第一个索引发生更改时,我希望更新ObservablesPropertyHelper布尔变量,如果该索引处的字符串不为null且不为空,则将其设置为true。或者,将集合转换为包含布尔值的第二个ObservableCollection的方法也可以。
以下是我尝试过的:

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);
    }