多重绑定和转换器的替代方案?

Alternative to multi-binding and converters?

我正在寻找替代方案,原因有二:

  1. 多重绑定和转换器不适用于 Xamarin.Android(如果我错了请纠正我)。
  2. 绑定要求至少有一侧是依赖项属性(这很糟糕)。

我会尝试通过代码来解释我想要的东西:

给定 类 Foo 和 Bar:

class Foo
{
    int a;
    int A
    {
        get { return a; }

        set
        {
            if (a == value)
                return;

            a = value;

            AChanged();
        }
    }


    int b;
    int B
    {
        get { return b; }


        set
        {
            if (b == value)
                return;

            b = value;

            BChanged();
        }
    }

    event Action AChanged;

    event Action BChanged;

}

class Bar
{
    int C { get; set; }
}

和方法添加:

    int Add(int a, int b)
    {

        return a + b;
    }

和实例 foo 和 bar,我希望 bar.C 通过 Add 函数绑定到 foo.Afoo.B。换句话说,当 A 或 B 发生变化时,我希望执行以下 to 语句:

bar.C = Add(foo.A, foo.B);

所以我想知道是否存在可以消除样板代码的解决方案。例如:

var binding = Binder.Bind(Add, ()=> bar.C, () => foo.A, () => foo.B);

binding.Enabled = true;

显然这可以手动完成,但是当您有 10 个来自不同 类 的属性并且每个属性都有一个或多个依赖项时,代码会变得混乱。

可以通过命名约定(例如,ProperyNameChanged)检测事件

我只是问是否存在这样的解决方案,所以我不会重新发明轮子。

P.S., 英语显然不是我的母语。随时纠正任何语法错误。如果您也可以用更简洁的方式重新表述问题,那就太好了。

也许您想看看 https://github.com/Muraad/Bind which is based on https://github.com/praeclarum/Bind。它只有一个文件。如果只是更改它,现在它可以在绑定的右侧使用方法调用。我将您的示例作为测试用例包含在内。

能写

var foo = new Foo() { A = 0, B = 0 };
var bar = new Bar();

// Bind bar.C to the right side of the == expression
IDisposable binding = NBind.Create(() => bar.C == Adder.Add(foo.A, foo.B));
foo.A = 42;
// bar.C is 42 now
foo.B = 42;
// bar.C is 84 now

唯一的要求是 Foo 实现 INotifyPropertyChanged。