【问题标题】:Combine dependency properties组合依赖属性
【发布时间】:2013-01-07 12:49:34
【问题描述】:

我现在做了几个 WPF 项目,看到同样的问题弹出,那就是聚合/组合依赖属性 (dp) 的“问题”。

例如,我有 10 个 bool 类型的 dp,我想将它们组合并作为单独的 dp 公开。组合的 dp 为真,除非它的一个或多个成分为假。

我目前使用 addValueChanged 来执行此操作,它为 10 个 (!() dp 中的每一个注册一个回调,但我想知道是否有更优雅的解决方案或者可能是一个解决这种常见场景的框架。我没有使用 reactiveUI 和mvvm light 但我认为它在这里很有用。

        var dpd = DependencyPropertyDescriptor.FromProperty(property,
                                                            owner.GetType());
        dpd.AddValueChanged(owner,
                            handler);

【问题讨论】:

    标签: wpf mvvm-light dependency-properties caliburn.micro reactiveui


    【解决方案1】:

    在 ReactiveUI 中是:

    // etc all the way to ten
    this.WhenAny(x => x.PropOne, x => PropTwo, x => x.PropThree, 
        (one,two,three) => one && two && three)
        .Subscribe(x => FinalProp = x);
    

    【讨论】:

      【解决方案2】:

      DependencyProperties 基于常规属性工作。

      每次设置根常规布尔属性之一时,您也可以为“组合”布尔属性提高 OnPropertyChanged。

      组合 bool 属性的 getter 应评估根 bool 属性。

      【讨论】:

        【解决方案3】:

        不确定它是否更优雅,但对于每个单独的 dep prop (1...10),您都有一个 setter。

        您可以在每个 Set 中调用(使用 Caliburn Micro 语法)

        OnPropertyChanged(() => depPropN);      // where N = 1 ..... 10
        OnPropertyChanged(() => combinedDepProp);
        

        【讨论】:

        • 您还可以为该对象覆盖 CM OnNotifyPropertyChanged 并检查正在更改的道具的属性名称,如果某个属性正在更改,您可以针对相关道具发出属性更改通知。我发现这对于我的属性 getter/setter 代码来说看起来不那么混乱
        猜你喜欢
        • 1970-01-01
        • 2013-02-07
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        • 2021-02-04
        • 1970-01-01
        • 2011-11-07
        相关资源
        最近更新 更多