3

に項目がある場合にのみ特定の XAML 要素が表示/非表示になるように、コンバーターを実装したいと考えていObservableCollectionます。

閉じたジェネリック型を知らずにジェネリック プロパティにアクセスする方法を参照しましたが、実装で動作させることができません。(Windows Phone 7 エミュレーターおよびデバイスへの) ビルドとデプロイは正常に行われますが、機能しません。さらに、Blend は例外をスローし、ページをレンダリングしなくなります。

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>
4

1 に答える 1

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();
    }


}
于 2013-02-16T18:17:23.677 に答える