У меня есть объект, который имеет IsReadOnly
свойство. Если это свойство имеет значение true, я хотел бы установить для IsEnabled
свойства кнопки (например) значение false.
Я хотел бы верить, что я могу сделать это так же легко, как IsEnabled="{Binding Path=!IsReadOnly}"
и с WPF.
Должен ли я пройти через все настройки стиля? Просто кажется слишком многословным для чего-то столь же простого, как установка одного bool на противоположное другому bool.
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
<Setter Property="IsEnabled" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
Ответы:
Вы можете использовать ValueConverter, который инвертирует свойство bool для вас.
XAML:
Преобразователь:
источник
!
этим это какой-то скучный код ... Люди прилагают огромные усилия, чтобы отделить то, что они считают "кодом", от этих бедных дизайнеров. Очень больно, когда я и кодер, и дизайнер.Вы рассматривали
IsNotReadOnly
недвижимость? Если привязываемый объект является ViewModel в домене MVVM, тогда дополнительное свойство имеет смысл. Если это прямая модель сущностей, вы можете рассмотреть состав и представление в форму специализированной модели представления вашей сущности.источник
При стандартной привязке необходимо использовать конвертеры, которые выглядят немного ветрено. Итак, я рекомендую вам взглянуть на мой проект CalcBinding , который был разработан специально для решения этой проблемы и некоторые другие. С помощью расширенного связывания вы можете писать выражения со многими исходными свойствами непосредственно в xaml. Скажем, вы можете написать что-то вроде:
или
или
или
где A, B, C, IsChecked - свойства viewModel и он будет работать правильно
источник
<Setter.Value><cb:Binding Path="!IsReadOnly" /></Setter.Value>
'Binding' недопустим для Setter.Value 'ошибка времени компиляцииЯ бы порекомендовал использовать https://quickconverter.codeplex.com/
Инвертировать логическое значение так же просто, как:
<Button IsEnabled="{qc:Binding '!$P', P={Binding IsReadOnly}}" />
Это ускоряет время, необходимое для написания конвертеров.
источник
Я хотел, чтобы мой XAML оставался настолько элегантным, насколько это возможно, поэтому я создал класс, чтобы обернуть bool, который находится в одной из моих общих библиотек, неявные операторы позволяют классу беспрепятственно использоваться как bool в code-behind
Единственные изменения, которые необходимо внести в ваш проект, - сделать так, чтобы свойство, которое вы хотите инвертировать, возвращало это вместо bool
А в постфиксе XAML связывание с Value или Invert
источник
bool
выражениям типов / переменным, даже не ссылаясь на обратное значение. Вместо этого я бы добавил метод расширения «Не» вBoolean
Struct
.Property
противMethod
заBinding
. Мое утверждение о «даунсайде» остается в силе. Кстати, метод «Boolean» «Not» по-прежнему полезен для избежания «!» Оператор, который легко пропустить, когда он (как это часто бывает) встроен рядом с символами, которые похожи на него (т. Е. Один / более "(" и "я" и "я").Этот также работает для обнуляемых bools.
источник
Добавьте еще одно свойство в вашу модель представления, которая будет возвращать обратное значение. И свяжи это с кнопкой. Подобно;
с точки зрения модели:
в xaml:
источник
Не знаю, относится ли это к XAML, но в моем простом приложении для Windows я создал привязку вручную и добавил обработчик событий Format.
источник
Format
иParse
события в привязках WinForms примерно эквивалентны конвертеру WPF.У меня была проблема с инверсией, но решение было аккуратным.
Мотивация заключалась в том, что разработчик XAML показывал пустой элемент управления, например, когда не было никакого datacontext / no
MyValues
(itemssource).Исходный код: скрыть управление, когда
MyValues
пусто. Улучшенный код: покажите элемент управления, когдаMyValues
НЕТ или пусто.Конечно, проблема заключается в том, как выразить «1 или более элементов», что противоположно 0 элементам.
Я решил это, добавив:
Ergo установил значение по умолчанию для привязки. Конечно, это не работает для всех видов обратных задач, но помогло мне с чистым кодом.
источник
Net .Net Core Solution 💡
Обрабатывает нулевую ситуацию и не выдает исключение, но возвращает,
true
если значение не представлено; в противном случае принимает введенное логическое значение и переворачивает его.Xaml
App.Xaml Мне нравится помещать все мои статические параметры конвертера в файл app.xaml, поэтому мне не нужно повторно объявлять их во всех окнах / страницах / элементах управления проекта.
Чтобы быть понятным,
converters:
это пространство имен для фактической реализации класса (xmlns:converters="clr-namespace:ProvingGround.Converters"
).источник
После ответа @ Paul я написал в ViewModel следующее:
Я надеюсь, что наличие фрагмента здесь поможет кому-то, возможно, новичку, как и я.
И если есть ошибка, пожалуйста, дайте мне знать!
Кстати, я также согласен с комментарием @heltonbiker - это, безусловно, правильный подход, только если вам не нужно использовать его более 3 раз ...
источник
Я сделал что-то очень похожее. Я создал свое свойство за кулисами, что позволило выбрать комбинированный список ТОЛЬКО, если он завершил поиск данных. Когда мое окно появляется впервые, оно запускает асинхронную загруженную команду, но я не хочу, чтобы пользователь нажимал на поле со списком, пока он все еще загружает данные (будет пустым, затем будет заполнен). Так что по умолчанию свойство имеет значение false, поэтому я возвращаю обратное значение в геттере. Затем, когда я ищу, я устанавливаю для свойства значение true и возвращаю значение false, когда завершено.
Затем для комбинированного списка я могу связать его непосредственно с IsSearching:
источник
Я использую похожий подход, как @Ofaim
источник