11

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

我知道对此有更好的控制,而且我知道在代码中很容易做到。我只是想知道 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 中工作的东西。

4

2 回答 2

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}"/>

最后在您的窗口/页面上创建一个名为 NotConverter 的资源:

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

IValueConverter您可以从MSDN获得更多信息。

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

于 2011-09-24T15:12:55.420 回答
3

如果我知道的话你不能绑定到!Property,但你可以写一个 IValueConverter 并在你的绑定中使用它。这里详细解释了如何设置返回 Negated Boolean 值的 IValueConverter。

IValueConverter 否定属性

于 2011-09-24T15:10:42.753 回答