Какой самый простой способ отобразить значения NULL как «NULL» с привязкой данных WPF? - PullRequest
6 голосов
/ 06 января 2009

У меня есть эта устаревшая база данных, для которой я создаю пользовательский просмотрщик, используя Linq to Sql.

Теперь некоторые поля в таблице могут иметь значение NULL. Использование обычной привязки данных в шаблоне данных (набирается для класса, сгенерированного конструктором ORM)

<TextBlock Text="{Binding Path=columnX}"/>    

Если columnX имеет значение NULL, ничего не отображается. (Похоже, это соглашение WPF). Вместо этого я бы хотел отобразить «NULL», если значение равно NULL. (эквивалентно column_value ?? "NULL")

Я мог бы использовать конвертер как в

<TextBlock Text="{Binding Path=columnX, Converter={StaticResource nullValueConverter}}"/>

Преобразователь класса

class NullValueConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    if (value == null)
      return "NULL";
    ...

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

Есть ли быстрый способ сделать это?

Ответы [ 3 ]

18 голосов
/ 06 января 2009

У класса привязки есть свойство с именем TargetNullValue , которое можно использовать для замены чего-либо еще, если привязка возвращает значение NULL. Ваш пример становится: -

<TextBlock Text="{Binding Path=columnX, TargetNullValue=My Substitute Text}"/>

Есть еще одно свойство класса Binding, которое также полезно: FallbackValue . Это будет заменяющее значение для использования, если выражение привязки не может быть разрешено (т.е. не найдено), например, когда используемый вами путь (columnX в вашем примере) не является членом контекста или источника данных.

Обновление (Gishu): требуется .NET Framework 3.5 SP1 53 МБ для загрузки. Без этого приведенный выше код не скомпилируется. TargetNullValue - это новое дополнение к классу Binding.

0 голосов
/ 06 января 2009

Я не думаю, что есть более чистый способ сделать это. Возможно, вы могли бы использовать DataTrigger в шаблоне стиля для получения значений NULL, но при использовании NULL триггеры данных могут быть немного «забавными», поэтому вам, вероятно, все равно понадобится конвертер.

0 голосов
/ 06 января 2009

Щелкните правой кнопкой мыши по файлу DBML, выберите Просмотр кода. Добавьте partial class для таблицы, с которой вы хотите работать. Добавьте свойство, возвращающее value ?? null или что-то подобное. Хитрость в том, что LINQ to SQL объявляет классы как частичные, поэтому вы можете легко их расширять.

...