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