XAML Связывание с противоположностью другого элемента - PullRequest
11 голосов
/ 24 сентября 2011

Я разрабатываю простое упражнение и хочу узнать, есть ли способ связать противоположность другого элемента, используя только 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, которая сначала проверит состояние кнопки запуска и вынудит состояние остановки остановиться наоборот. Или любые другие подобные хаки или обходные пути, для которых не требуется задний код.

Спасибо за любую помощь в этом.

редактирует: Помните, что ключевым моментом для этого является отсутствие кода позади. Если мне нужно написать одну строку кода, я мог бы просто использовать обработчик событий onclick и простой оператор?:. Поэтому я хочу только то, что будет работать непосредственно в XAML.

Ответы [ 2 ]

16 голосов
/ 24 сентября 2011

Нет операции 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 .

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

3 голосов
/ 24 сентября 2011

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

IValueConverter для отрицания свойства

...