EmptyListToVisibilityConverter

Mad*_*Seb 4 wpf binding

我正在尝试为WPF做一个"空列表到可见性转换器".这是一个IValueConverter,它接受一个对象(应该是一个列表),如果列表为空(或者如果传递的对象为null),它应返回Visibility.Collapsed; 如果列表不为空,则应返回Visibility.Visibile;

我打算将它用于数据网格.计划是每当给予ItemsSource的列表是空列表或null时,使datagrid不可见(折叠).

<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>
Run Code Online (Sandbox Code Playgroud)

我写了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();
    }
Run Code Online (Sandbox Code Playgroud)

当Items被赋予null时,这种方法很有效但是当Item作为List给出时它不起作用...我认为代码如下:不正确,无法检测"value"是否是列表...任何提示?

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

关于如何做到这一点的任何提示?

小智 7

您不能将列表转换为IList <Object>,但可以将其强制转换为ICollection,然后使用ICollection.Count:请参阅http://devw.wordpress.com/2011/07/18/empty-list-visibility -转换器/

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}}”>
Run Code Online (Sandbox Code Playgroud)


小智 5

我想问题是,当您添加或删除项目时,收集对象保持不变。因此,绑定不会更新值,并且不会调用转换器。


小智 5

我认为这很简单,你看:

  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();
    }
  }
Run Code Online (Sandbox Code Playgroud)

希望能有所帮助,谢谢!- 沙姆斯