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, чтобы отменить свойство