DataTrigger, где значение НЕ равно нулю?

Я знаю, что могу сделать сеттер, который проверяет, имеет ли значение значение NULL и что-то делает. Пример:

           

Но как я могу проверить «не» значение … как в «NOT NULL», или «NOT = 3»? Это возможно в XAML?

Результаты: Спасибо за ваши ответы … Я знал, что могу сделать конвертер значений (это означает, что мне придется идти в коде, и это не будет чистым XAML, как я надеялся). Тем не менее, это отвечает на вопрос, что эффективно «нет» вы не можете сделать это в чистом XAML. Однако выбранный ответ показывает, вероятно, лучший способ создать такую ​​функциональность. Хорошая находка.

Я столкнулся с аналогичным ограничением с DataTriggers, и, похоже, вы можете проверить только на равенство. Самая близкая вещь, которую я видел, которая могла бы вам помочь, – это метод для других сравнений, отличных от равенства.

В этом блоге описывается, как делать сравнения, такие как LT, GT и т. Д. В DataTrigger.

Это ограничение DataTrigger можно в некоторой степени отработать, используя Конвертер для массажа данных в специальное значение, которое вы можете сравнить с ним, как это было предложено в ответе Роберта Макни.

Вы можете использовать IValueConverter для этого:

         

Где IsNullConverter определен в другом месте (и conv установлен для ссылки на его пространство имен):

 public class IsNullConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return (value == null); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new InvalidOperationException("IsNullConverter can only be used OneWay."); } } 

Более общим решением было бы реализовать IValueConverter, который проверяет равенство с ConverterParameter, поэтому вы можете проверять что-либо, а не просто null.

Это немного обман, но я просто установил стиль по умолчанию, а затем переопределял его с помощью DataTrigger, если значение равно null …

   

Сравните с нулевым (как сказал Майкл Нунан):

  

Сравнение с нулевым (без конвертера):

  

Я использую это, чтобы включить только кнопку, если выбран элемент списка (т. Е. Не null):

  

Вы можете использовать class DataTrigger в Microsoft.Expression.Interactions.dll, который поставляется с Expression Blend .

Образец кода:

     

Используя этот метод, вы можете запускать и против GreaterThan и LessThan . Чтобы использовать этот код, вы должны ссылаться на две библиотеки dll:

System.Windows.Interactivity.dll

Microsoft.Expression.Interactions.dll

    

Я просто использовал обратную логику здесь … установка моей панели стека невидимым, когда мой комбо-элемент не заполнен, он работает очень хорошо!

Стоп! Нет конвертера! Я не хочу «продавать» библиотеку этого парня, но я ненавидел факт создания конвертера каждый раз, когда мне хотелось сравнить вещи в XAML.

Итак, с этой библиотекой: https://github.com/Alex141/CalcBinding

вы можете сделать это [и многое другое]:

Во-первых, в объявлении windows / userControl:

  

затем в текстовом блоке

          

Магическая часть – это conv: Binding ‘MYValue == null . Фактически, вы можете установить любое условие, которое вам нужно [посмотреть на документ].

обратите внимание, что я не поклонник третьей стороны. но эта библиотека бесплатна и мало влияет (просто добавьте в проект 2 DLL).

Мое решение находится в экземпляре DataContext (или ViewModel при использовании MVVM). Я добавляю свойство, которое возвращает true, если условие Not Null, которое я хочу, выполняется.

  Public ReadOnly Property IsSomeFieldNull() As Boolean Get Return If(SomeField is Null, True, False) End Get End Property 

и привязать DataTrigger к вышеуказанному свойству. Примечание. В VB.NET обязательно используйте оператор If и NOT IIf, который не работает с объектами Null. Тогда XAML:

     

Преобразователь:

 public class NullableToVisibilityConverter: IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return value == null ? Visibility.Collapsed : Visibility.Visible; } } 

Переплет:

 Visibility="{Binding PropertyToBind, Converter={StaticResource nullableToVisibilityConverter}}" 

Вы можете использовать конвертер или создать новое свойство в своей модели ViewModel следующим образом:

 public bool CanDoIt { get { return !string.IsNullOrEmpty(SomeField); } } 

и использовать его:

  

Если вы ищете решение, которое не использует IValueConverter, вы всегда можете использовать механизм ниже

                 
  • Как сделать привязки в ItemContainerStyle в WinRT?
  • Загрузка файлов с Java-клиента на HTTP-сервер
  • Кто-нибудь знает набор привязок C # для FFMPEG?
  • Как связать список с dataGridView?
  • Привязка списка в @RequestParam
  • Как вы привязываете CollectionContainer к коллекции в модели представления?
  • Пользовательское связующее устройство для объекта
  • Ранняя и поздняя привязка
  • Список привязок к DataGridView в WinForm
  • Связывание Datagrid в WPF
  • WinForms DataGridView - привязка к объекту со свойством списка (переменное число столбцов)
  • Interesting Posts

    Как просмотреть кэшированную веб-страницу Chrome?

    Как использовать ссылочные переменные по символьной строке в формуле?

    Есть ли программное обеспечение, позволяющее мне искать PDF-файл с помощью Regex?

    Как автоматически переключаться между страницами ViewPager

    ADO.Net Entity Framework Объект сущности не может ссылаться на несколько экземпляров IEntityChangeTracker

    Матричная обратная точность

    jQuery скрыть элемент при нажатии в любом месте страницы

    вызывать метод асинхронного вызова без ожидания # 2

    Введите ключевой обработчик события

    Использует ли Tor запрет моему ISP / sysadmin видеть, какие сайты я посещаю?

    Как я могу запустить программный экран приложений Android?

    Как диагностировать медленную загрузку или вход в систему Windows?

    Что такое PDB-файл?

    Можно ли использовать базовую аутентификацию HTTP с помощью Django?

    Что такое разъем AAFP на материнской плате?

    Давайте будем гением компьютера.