Wpf EmptyListToVisibilityConverter

Wpf EmptyListToVisibilityConverter,wpf,binding,Wpf,Binding,我正在尝试为WPF做一个“空列表到可见性转换器”。 这是一个IValueConverter,它接受一个对象(应该是一个列表),如果列表为空(或者如果传递的对象为空),它应该返回可见性;如果列表不是空的,它应该返回Visibility.Visibile 我计划将其用于datagrid。我们的计划是,每当提供给ItemsSource的列表为空列表或空列表时,使datagrid不可见(折叠) <my:DataGrid Name="dataGridAuxi

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

我计划将其用于datagrid。我们的计划是,每当提供给ItemsSource的列表为空列表或空列表时,使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>

我猜这是因为您在转换器中使用了
IList
,但您的实际集合是一个
IList
。请看,IList不是协变的,因此不能将任何
IList
转换为
IList
。我的建议是尝试在转换器中使用
IEnumerable
,并使用Count()扩展方法来确定集合中的项目数。

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

您不能将列表强制转换为IList,但可以将其强制转换为ICollection,然后使用ICollection。计数:请参阅

公共类EmptyListVisibilityConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
如果(值==null)
返回可见性。折叠;
其他的
{
ICollection list=作为ICollection的值;
如果(列表!=null)
{
如果(list.Count==0)
返回可见性。折叠;
其他的
返回可见性。可见;
}
其他的
返回可见性。可见;
}
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
我认为这很简单,给你:

希望能帮上忙,谢谢Shams版本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;
}

更好的替代方法是使用ObservableCollection,然后绑定到其Count属性:

Hi-MadSeb。请停止在你的帖子上签名。诚恳地向你和你的孩子们致意,我使用了“Any”而不是Count()>0>((IEnumerable)value)。Any()?可见性.可见:可见性.折叠;
if (value is IList<Object>)
            {
                if ((value as IList<Object>).Count == 0)
                {
                    return Visibility.Collapsed;
                }
                else
                {
                    return Visibility.Visible;
                }
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}}”>
  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();
    }
  }
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;
}