XAML Привязка к противоположному другому элементу

Я разрабатываю простое упражнение и хочу знать, существует ли способ привязки к противоположному другому элементу, используя только XAML. Например. У меня есть две кнопки на форме: "Пуск" и "Стоп", возможно, для таймера. Я не хочу, чтобы оба они включались одновременно. Когда программа запускается, кнопка остановки должна быть отключена. Когда нажата кнопка запуска, она должна быть отключена, и кнопка остановки включена. Затем наоборот, пока пользователь не уйдет.

Я знаю, что для этого есть лучший контроль, и я знаю, что это легко сделать в коде. Я просто хотел знать, есть ли какой-то оператор NOT в XAML, который может выглядеть так:

<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.

Ответ 1

Операция 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>

Вы можете получить дополнительную информацию о IValueConverter из MSDN.

Тогда использование может использовать этот конвертер значений в любом месте. Вы можете вытащить его из ресурсов Window и сделать его ресурсом уровня приложения, поэтому вам не нужно указывать его в каждом окне.

Ответ 2

Если я знаю это правильно, вы не можете привязываться к свойству!, но вы можете написать IValueConverter и использовать его в своей привязке. И здесь подробно объясняется, как вы можете настроить IValueConverter, который возвращает значение Negated Boolean.

IValueConverter, чтобы отменить свойство