多重绑定和转换器的替代方案?
Alternative to multi-binding and converters?
我正在寻找替代方案,原因有二:
- 多重绑定和转换器不适用于 Xamarin.Android(如果我错了请纠正我)。
- 绑定要求至少有一侧是依赖项属性(这很糟糕)。
我会尝试通过代码来解释我想要的东西:
给定 类 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.A
和 foo.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。
我正在寻找替代方案,原因有二:
- 多重绑定和转换器不适用于 Xamarin.Android(如果我错了请纠正我)。
- 绑定要求至少有一侧是依赖项属性(这很糟糕)。
我会尝试通过代码来解释我想要的东西:
给定 类 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.A
和 foo.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。