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

Fra*_*ers 11 c# data-binding xaml recursive-databinding c#-4.0

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

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

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

或类似的东西:

                    Path != IsEnabled}"/>
Run Code Online (Sandbox Code Playgroud)

甚至是:

                    Path=IsEnabled.Not()}"/>
Run Code Online (Sandbox Code Playgroud)

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

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

感谢您的帮助.

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

vcs*_*nes 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其指定为绑定上的转换器.

<Button Content="_Stop" Name="btnStop"
    IsEnabled="{Binding ElementName=btnStart, Converter={StaticResource NotConverter} Path=IsEnabled}"/>
Run Code Online (Sandbox Code Playgroud)

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

<Window.Resources>
    <ns:NotConverter x:Key="NotConverter" />
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

您可以IValueConverterMSDN获取更多信息.

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

  • @FrancisRodgers如果想自己处理点击事件,那没关系.但是你只需要写一次这个值转换器**.什么时候需要处理17个按钮?写下所有17的点击处理程序,或写一次值转换器?它可以重复使用. (2认同)