XAML绑定到另一个元素的反面

时间:2011-09-24 15:02:27

标签: c# xaml data-binding c#-4.0 recursive-databinding

我正在开发一个简单的练习,想要知道是否有一种方法只使用XAML绑定到另一个元素的反面。例如。我在表单上有两个按钮,Start和Stop可能是一个计时器。我不希望两者同时启用。程序启动时,应禁用停止按钮。单击开始按钮时,应禁用它并启用停止按钮。然后反之亦然,直到用户退出。

我知道有更好的控件,我知道在代码中很容易做到。我只是想知道XAML中是否存在某种类似于NOT的运算符:

<Button Content="_Start" Name="btnStart"/>
<Button Content="_Stop" Name="btnStop"
        IsEnabled="{Binding ElementName=btnStart,
                    Path=Not(IsEnabled)}"/>

或类似的东西:

                    Path != IsEnabled}"/>

甚至可能是:

                    Path=IsEnabled.Not()}"/>

我知道我可以直接绑定到开始按钮,但是当一个启用时,另一个启用按钮,同样禁用它时。看看我来自哪里。

我甚至愿意接受某种XAML Validation thehnique,它将首先检查启动按钮的状态并强制停止状态为相反。或任何其他不需要代码隐藏的类似黑客或变通办法。

感谢您提供任何帮助。

编辑: 请记住,关键点是没有代码。如果我必须编写一行代码,我可以使用onclick事件处理程序和一个简单的?:运算符。所以我只希望能直接在XAML中使用。

2 个答案:

答案 0 :(得分:16)

没有开箱即用的Not操作。但是,使用自定义转换器很容易实现这一点:

public class NotConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return !(bool) value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return !(bool)value;
    }
}

然后您可以在绑定中将其指定为转换器。

<Button Content="_Stop" Name="btnStop"
    IsEnabled="{Binding ElementName=btnStart, Converter={StaticResource NotConverter} Path=IsEnabled}"/>

最后在您的Window / Page上创建一个名为NotConverter的资源:

<Window.Resources>
    <ns:NotConverter x:Key="NotConverter" />
</Window.Resources>

您可以从MSDN获取有关IValueConverter的更多信息。

然后使用可以在任何您喜欢的地方使用此值转换器。您可以将其从Window资源中拉出来并使其成为应用程序级资源,这样您就不必在每个窗口中指定它。

答案 1 :(得分:3)

如果我知道它,那么你就无法绑定到!属性,但你可以写一个IValueConverter并在你的绑定中使用它。 在这里详细解释了如何设置一个返回Negated布尔值的IValueConverter。

IValueConverter to negate a property