Laden...

ItemsSource mit zwei Quellen?

Erstellt von Taladan vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.842 Views
Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren
ItemsSource mit zwei Quellen?

Hallo, kann ich einen ItemSource mehr als eine Quelle zu ordnen? Um genauer zu sein, zwei ObservableCollection?

Gruß dat Tala

446 Beiträge seit 2004
vor 14 Jahren

Hallo,

du meinst ein Objekt d. z.b so aussieht

public ZweiListen
{
public IEnumerable listeeins {get;set;}
public IEnumerable listezwei {get;set;}
}

Falls ja.

Klar kannst du eine eigene ItemsSource erstellen die so aussieht. Wenn du aber so ein Objekt einer ListBox / ListView übergeben willst geht das nicht.

Den die Propertie ItemsSource vom ItemsControl (ListBox und ListView sind von diesem abgeleitet) haben als Typ IEnumerable implementiert. D.h. du kannst nur Listen, Array bzw. alle die dieses Interface implementieren übergeben.

Erstell doch einfach 2 seperate ListBoxen die nebeneinander sind.?

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Genau das will ich.

Ich habe in der einen Collection die Pfade enthalten. In der anderen dann die Elemente.

Gruß dat Tala

446 Beiträge seit 2004
vor 14 Jahren

Am einfachsten wäre es natürlich wenn du aus den zwei ObservableCollections eine machst.

Vereinfach dargestellt:

Also aus dem hier:


        public class PfadObjekt
        {
            public string Pfad { get; set; }
        }
        public class EinanderesObjekt
        {
            public object EinAnderesObjekt { get; set; }
        }
        public ObservableCollection<PfadObjekt> PfadList { get; set; }
        public ObservableCollection<PfadObjekt> EinanderesObjekt { get; set; }

eine neue passende Klasse erstellst, die die zwei benötigten Properties beinhaltet. Dazu schreibst du noch eine Funktion die aus den 2Listen eine neue macht.

        public class EinandresOjektMitPfad
        {
            public string Pfad { get; set; }
            public object EinAnderesObjekt { get; set; }
            public static EinandresOjektMitPfad Convert(ObservableCollection<PfadObjekt> pPfadObjektList, ObservableCollection<EinanderesObjekt> pEinanderesObjekt)
            {
                EinandresOjektMitPfad einandresOjektMitPfad = new EinandresOjektMitPfad();
                //todo aus den zwei listen eine EinandresOjektMitPfadList machen
                return einandresOjektMitPfad;
            }
        }

So etwas in der Art.

Dann kannst du ganz einfach die neu erstellte liste der ListBox oder ListView übergeben.

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Dumme Frage, gibt es eine ableitung von ObservableCollection die mit zwei Datentypen zu recht kommt?

Gruß dat Tala

446 Beiträge seit 2004
vor 14 Jahren

Hallo,

es gibt nur

ObservableCollection<T>
ObservableCollection<T,T>

gibt es nicht.

Dafür must du dir entweder eine eigene Klasse schreiben oder wie gesagt ein Objekt mit den 2 Properties erstellen.

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Ich glaube das was du gepostet hast, ist nicht das was ich suche. Ich möchte nicht Pfad und Item irgendwie zusammen frickeln, es sollen unabhängige Objekte sein.

Wenn im TreeView der Header ein Item enthält was in eigenschaft Path beispielsweise root\element12 stehen hat, sollen aus der Collection 2 alle Items angezeigt werden, die ebenfalls diesen eigenschaftswert hat. und zwar als eigenständige TreeViewItems.

edit: ich blicke auch grad nicht deinen Beispielcode.

Gruß dat Tala

1.044 Beiträge seit 2008
vor 14 Jahren

Hallo Taladan,

mit deiner Problemstellung habe ich mich auch befasst. Siehe dazu Trennung zwischen UI und Code mit verschiedenen Datenquellen. An deiner Stelle würde ich folgendermaßen vorgehen: Eine List, wo sich eine ObservableCollection befindet anlegen, wo man alle Klassen hinzufügt, die von ObservableCollection erben oder einen Property davon besitzen zur Liste hinzufügen. Das ganze könnte man nun als Property oder direkt "in" die Klasse einbinden. Anschließend im XAML-Code daran binden. Lange Rede, kurzer Sinn - hier ein Beispiel:

public class Person
{
    public string Firstname { get; set; }
    public int Age { get; set; }
}

public class PersonsA : ObservableCollection<Person>
{
    public PersonsA()
    {
        this.Add(new Person { Firstname = "zero_x", Age = 0 });
    }
}

class PersonsB : ObservableCollection<Person>
{
    public PersonsB()
    {
        this.Add(new Person { Firstname = "Taladan", Age = 355 });
    }
}

public class PersonsAll
{
    public ObservableCollection<Person> Get
    {
        get
        {
            // Code vereinfacht - lässt sich natürlich einfacher umsetzen.
            List<ObservableCollection<Person>> list = new List<ObservableCollection<Person>>();
            list.Add(new PersonsA());
            list.Add(new PersonsB());

            ObservableCollection<Person> p = new ObservableCollection<Person>();

            foreach (ObservableCollection<Person> item in list)
            {
                foreach (Person p2 in item)
                {
                    p.Add(p2);
                }
            }

            return p;
        }

    }
}
<ListBox ItemsSource="{Binding Source={StaticResource p}, Path=Get}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Firstname}"/>
                <TextBlock Text="{Binding Age}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

zero_x