EmptyListToVisibilityConverter - PullRequest
       1

EmptyListToVisibilityConverter

4 голосов
/ 25 сентября 2010

Я пытаюсь сделать «конвертер пустого списка в видимость» для WPF.Это IValueConverter, который принимает объект (который должен быть списком), и если список пуст (или если переданный объект является нулем), он должен вернуть Visibility.Collapsed;если список не пустой, он должен вернуть Visibility.Visibile;

Я планирую использовать это для сетки данных.План состоит в том, чтобы сделать сетку данных невидимой (свернутой) всякий раз, когда список, данный для ItemsSource, является пустым списком или пустым.

<my:DataGrid 
                    Name="dataGridAuxiliaryTools"
                    Style="{StaticResource DataGridStyle}"
                    CellStyle="{StaticResource DataGridCellStyle}"
                    ColumnHeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
                    ItemsSource="{Binding Path=Items}"
                    IsReadOnly="False"
                    Visibility="{Binding Path=Items, 
                    Converter={StaticResource emptyListToVisibilityConverter}}"
 </my:DataGrid>

Я написал EmptyListToVisibilityConverter следующим образом:

public class EmptyListToVisibilityConverter : IValueConverter
    {
    public object Convert(object value, Type targetType, object parameter,
                          CultureInfo culture)
    {
        if (value == null)
        {
            return Visibility.Collapsed;
        }
        else if (value is IList<Object>)
        {
            if ((value as IList<Object>).Count == 0)
            {
                return Visibility.Collapsed;
            }
            else
            {
                return Visibility.Visible;
            }
        }
        else
        {
            return Visibility.Visible;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter,
                              CultureInfo culture)
    {
        throw new NotImplementedException();
    }

Это хорошо работает, когда Items задан как null, но когда Items задан как List, он не работаетдумаю, что приведенный ниже код неверен и не может определить, является ли «значение» списком или нет ... Есть какие-то подсказки?

if (value is IList<Object>)
            {
                if ((value as IList<Object>).Count == 0)
                {
                    return Visibility.Collapsed;
                }
                else
                {
                    return Visibility.Visible;
                }

Любые советы о том, как это сделать?

Ответы [ 6 ]

7 голосов
/ 18 июля 2011

Вы не можете преобразовать свой список в IList , но вы можете преобразовать его в ICollection, а затем использовать ICollection.Count: см. http://devw.wordpress.com/2011/07/18/empty-list-visibility-converter/

public class EmptyListVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return Visibility.Collapsed;
        else
        {
            ICollection list = value as ICollection;
            if (list != null)
            {
                if (list.Count == 0)
                    return Visibility.Collapsed;
                else
                    return Visibility.Visible;
            }
            else
                return Visibility.Visible;
        }
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

    {
        throw new NotImplementedException();
    }
}
<ListBox x:Name=”NameChoiceListBox”
         ItemsSource=”{Binding NamesList}”
         SelectedItem=”{Binding SelectedName, Mode=TwoWay}”
         ItemTemplate=”{StaticResource DataTemplateNameChoice}”
         Visibility=”{Binding NamesList, Converter={StaticResource EmptyListVisibilityConverter}}”>
5 голосов
/ 23 мая 2011

Полагаю, проблема в том, что объект коллекции остается тем же самым, когда вы добавляете или удаляете элементы из него.Таким образом, привязка не обновляет значение, и преобразователь не вызывается.

4 голосов
/ 24 ноября 2015

Я думаю, что это довольно просто, вот, пожалуйста:

  public class NullOrEmptyCollectionToVisibilityConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      if (value == null) return Visibility.Collapsed;

      var collection = value as ICollection;
      return collection != null ? (collection.Count == 0 ? Visibility.Collapsed : Visibility.Visible) : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }

Надеюсь, поможет, спасибо!- Шамс

2 голосов
/ 25 сентября 2010

Я предполагаю, что это из-за того, что вы используете IList<Object> в конвертере, но ваша фактическая коллекция - IList<SomethingElse>. Видите, IList не является ковариантным, поэтому вы не можете просто конвертировать IList<T> в IList<Object>. Мое предложение будет заключаться в том, чтобы вместо этого использовать IEnumerable<object> в конвертере и использовать метод расширения Count () для определения количества элементов в коллекции.

1 голос
/ 01 марта 2018

C # версия 7 поддерживает сопоставление с образцом. Теперь вы можете написать:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    switch (value)
    {
        case null:
            return Visibility.Collapsed;
        case ICollection list:
            return list.Count == 0 ? Visibility.Collapsed : Visibility.Visible;
    }

    return Visibility.Visible;
}
0 голосов
/ 14 августа 2018

Лучшей альтернативой является использование ObservableCollection и затем привязка к его свойству Count: Конвертеры WPF и ObservableCollections

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...