具有计算属性和依赖关系跟踪的WPF C#ViewModel。模拟Knockut JS

时间:2016-10-02 18:57:28

标签: wpf xaml silverlight mvvm

是否有任何库以Knockout JS的方式实现MVVM的ViewModel。

因此,它应该支持Computed Properties自动Dependency Tracking

我没有找到无缝通知和验证的东西(我在Knockout JS中如何知道)。

或者,请给我一个如何做到这一点的建议。

我有自己的代码库。它甚至支持Func-validators的依赖性跟踪(我也喜欢) 所有这些都是很久以前的事情,现在它已经无法编译了。

我的意思的一些例子。

public partial class MyViewModel : ValidatableViewModel

// Some property with the validator.

    public Double? LoanAmount
    {
        get { return _innerDataObject.LoanAmount; }
        set
        {
            _innerDataObject.LoanAmount = value;

            // Validators with dependency tracking.
            PropertyChangedInSetter(new ValidatableContext("LoanAmount")
                {
                    FuncValidators = new List<Func<ValidationResult>>
                        {
                            () =>
                            {
                                if (LoanParametersEnabled == false)
                                    return null;

                                if (LoanParametersUnrequired
                                    && LoanAmount.HasValue == false)
                                    return null;

                                if (LoanAmount.HasValue == false)
                                    return new ValidationResult(ErrorMessages.RequiredValue);

                                // ... 
                            }
                        },

                }
            );
        }
    }

//一些受到污染的财产。

    public Double? LimitLoanProductCalculated
    {
        get
        {
            // dependency tracking for a computed property.
            var res = GetComputedResult(() => GetSomeThingsForUi(
                LimitLoanProductMax,
                CardVariantOrNull,
                LimitGlobalCalculated
                ));

            return res;
        }
    }

2 个答案:

答案 0 :(得分:3)

我写了Moldinium,它为.NET做了Knockout风格的依赖关系跟踪。

自述文件:

Moldinium允许您定义这样的类:

public abstract class Course : IModel
{
    public abstract String Name { get; set; }

    public abstract Room Location { get; set; }

    public virtual String Description
        => $"course {Name} in room {Location.Name}";
}

public abstract class Room : IModel
{
    public abstract String Name { get; set; }
}

您无需任何其他代码即可获得以下内容:

  • 对于声明为abstract或virtual的所有属性的INotifyPropertyChanged实现。
  • 属性Course.Description会自动更新Course.LocationCourse.Location.Name的更改。

答案 1 :(得分:1)

我已经使用PropertyChanged.Fody多年了。它适用于自动属性和计算属性。