Laden...

Wie ein DependencyProperty entwickeln, das eine generische ObservableCollection akzeptiert?

Letzter Beitrag vor 4 Jahren 3 Posts 896 Views
Wie ein DependencyProperty entwickeln, das eine generische ObservableCollection akzeptiert?

Hi, ich hoffe ihr könnt mir bei meinem Problem helfen:

Wir entwickeln gerade ein UserControl, dass eine ObservableCollection einer beliebigen Klasse als DP bekommt und zugehörig dazu - ebenfalls als DP - eine Liste, welche Properties (als Strings) der Klassenobjekte jeweils dargestellt werden sollen.

Das Problem, dass wir jetzt haben, wie die DP gestaltet sein soll, um alle verschiedenen Klassen zu akzeptieren. Wir nutzenaktuell ein object, dass dann in eine ObservableCollection gecastet werden muss und verzweifeln da gerade dran.

        public object Data
        {
            get { return ((object)GetValue(DataProperty)); }
            set { SetValue(DataProperty, value); }
        }

        public static readonly DependencyProperty DataProperty =
            DependencyProperty.Register("Data", typeof(object), typeof(TestControl), new PropertyMetadata(null, new PropertyChangedCallback(DataChanged)));

        private static void DataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var tmp = ((TestControl)d).Data;
        }

Gibt es dafür eine einfache Lösung oder macht eine ganz andere Herangehensweise?

Warum braucht ihr an dieser Stelle hier den konkreten Typ ObservableCollection<T> ? Reicht euch ggf. auch das INotifyCollectionChanged als Interface ggf. in Kombination mit ICollection / IList?

Warum benötigt ihr Zugriff auf den konkreten Typen? Reicht euch ggf. nicht einfach davon auszugehen, dass Data eine IList ist ( wohlgemerkt ohne den generic Type ). Ihr könntet dann über Reflection den Generic Type der IList ermitteln und dann ebenfalls über reflection eure Properties ermitteln.


  public static Type GetGenericTypeDefinitionOfIEnumerable(this Type enumerable)
        {
            return enumerable.GetInterfaces().Where(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
                .SelectMany(t => t.GetGenericArguments()).First();
        }

Hi, danke für die schnelle Antwort. Die Klasse und als welche Collection oder List es gecastet wird, ist eigentlich egal. Hauptsache wird kommen auf die einzelnen Objekte und können über den Property-Namen auf die Werte der einzelnen Felder zugreifen.