我还没有找到一种特别易于使用的将表达式嵌入到XAML中的方法,所以这是我一直在使用的替代方法:
BindingOperations.SetBinding(myBtn, Button.IsEnabledProperty, LambdaBinding.New(
new Binding { Source = myObject,
Path = new PropertyPath(ComboBox.SelectedIndexProperty) },
(int selectedIndex) => selectedIndex >= 0
));
你需要用C#编写这个,比如在窗口的构造函数中。
这也适用于多源绑定,而且可以无缝地工作:
BindingOperations.SetBinding(myBtn, Button.IsEnabledProperty, LambdaBinding.New(
new Binding ,
new Binding ,
(int selectedIndex, double height) => selectedIndex >= 0 && height > 10.5
));
观察到lambda是静态类型的,任何类型错误都会(相对)嘈杂,有助于追踪它们。 lambda返回类型也会被考虑在内;您可以使用它来将一个对象的宽度绑定为基于另一个对象宽度的复杂公式...
这个LambdaBinding类不是内置的;您必须包含
LambdaBinding.cs文件。
旁注。真遗憾XAML不允许表达式。是的,我意识到XAML应该是“面向设计师”的,并且摆脱了我们称之为应用逻辑的难以捉摸的东西,但我们在这里开玩笑吗...首先,其他答案中显示的DataTrigger基本上是一个条件表达式,因此与
{Binding source.SelectedIndex >= 0}
没有区别(只是要长得多)。其次,如果想法是简单性,则设计师应该能够编写的绑定表达式远远超出非程序员的能力范围...如果您需要证明,请考虑以下内容:
{Binding RelativeSource={RelativeSource AncestorType={x:Type UIElement},
AncestorLevel=1},
Path=IsEnabled}