我正在开发一个简单的练习,想要知道是否有一种方法只使用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中使用。
答案 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。