WPF条件绑定。 Button.IsEnabled to SelectedIndex> = 0

时间:2010-05-26 01:42:51

标签: wpf data-binding xaml binding

我想将按钮IsEnabled属性绑定到类似myObject.SelectedIndex >= 0的条件。有没有一种简单的方法在xaml中执行此操作(不必对任何底层对象做疯狂的事情)?我还没有看到一个很好的例子。

老实说,我希望这和Flex 3一样简单...... I.E。:

<mx:Button enabled="{dataGrid.SelectedIndex >= 0}" ...

2 个答案:

答案 0 :(得分:16)

如果没有选择,

SelectedIndex为-1,对吧?颠倒你的逻辑并使用触发器:

<Button ...>
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="enabled" Value="True" />

            <Style.Triggers>
                <DataTrigger
                    Binding="{Binding SelectedIndex,ElementName=dataGrid}"
                    Value="-1">

                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    <Button.Style>
<Button>

答案 1 :(得分:2)

我还没有找到一种特别易于使用的方法将表达式嵌入到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 { Source = myObject,
                  Path = new PropertyPath(ComboBox.SelectedIndexProperty) },
    new Binding { Source = myObject2,
                  Path = new PropertyPath(Button.ActualHeightProperty) },
    (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}