2013-02-16 2 views
3

Я хочу реализовать конвертер так, чтобы определенные элементы XAML отображались/исчезали только в том случае, если есть элементы в ObservableCollection.Как реализовать конвертер CollectionLengthToVisibility?

Я ссылался на How to access generic property without knowing the closed generic type, но не могу заставить его работать с моей реализацией. Он создает и развертывает ОК (для эмулятора и устройства Windows Phone 7), но не работает. Кроме того смесь выбрасывает исключение и больше не будет отображения страницы,

NullReferenceException: ссылка на объект не указывает на экземпляр объекта .

Вот то, что я до сих пор,

// Sets the vsibility depending on whether the collection is empty or not depending if parameter is "VisibleOnEmpty" or "CollapsedOnEmpty" 
public class CollectionLengthToVisibility : System.Windows.Data.IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo cultureInfo) 
    { 
     // From https://stackoverflow.com/questions/4592644/how-to-access-generic-property-without-knowing-the-closed-generic-type 
     var p = value.GetType().GetProperty("Length"); 
     int? length = p.GetValue(value, new object[] { }) as int?; 

     string s = (string)parameter; 
     if (((length == 0) && (s == "VisibleOnEmpty")) 
      || ((length != 0) && (s == "CollapsedOnEmpty"))) 
     { 
      return Visibility.Visible; 
     } 
     else 
     { 
      return Visibility.Collapsed; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo cultureInfo) 
    { 
     return null; 
    } 


} 

Вот как я сослалась на преобразователь на Blend,/XAML

<TextBlock Visibility="{Binding QuickProfiles, ConverterParameter=CollapsedOnEmpty, Converter={StaticResource CollectionLengthToVisibility}}">Some Text</TextBlock> 

ответ

2

Я хотел бы использовать метод Enumerable.Any() расширения. Он будет работать на любом IEnumerable<T> и позволит вам знать, с какой коллекцией вы имеете дело. Поскольку вы не знаете T, вы можете использовать только .Cast<object>()

public class CollectionLengthToVisibility : System.Windows.Data.IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo cultureInfo) 
    { 
     var collection = value as System.Collections.IEnumerable; 
     if (collection == null) 
      throw new ArgumentException("value"); 

     if (collection.Cast<object>().Any()) 
       return Visibility.Visible; 
     else 
       return Visibility.Collapsed;  
    } 

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


} 
Смежные вопросы