Laden...

Wie ein DependencyProperty entwickeln, das eine generische ObservableCollection akzeptiert?

Erstellt von NOFX vor 3 Jahren Letzter Beitrag vor 3 Jahren 827 Views
N
NOFX Themenstarter:in
42 Beiträge seit 2015
vor 3 Jahren
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?

301 Beiträge seit 2009
vor 3 Jahren

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();
        }
N
NOFX Themenstarter:in
42 Beiträge seit 2015
vor 3 Jahren

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.