none
ListBox ve WPF

    Dotaz

  • Zdravím,

    potřeboval bych poradit. Mám třídu pojmenuju ji třeba "Words" ve které mám 2 proměnné typu string například: "first" a "second". A teď potřebuji vkládat objekt typu Words do listboxu tak aby se mi nějak pěkně zobrazili obě proměnné first a second. A pokud někdo klikne na položku v listboxu tak zase chci dostat zpátky objekt typu Words.

    Snad jsem to pochoptelně napsal. Předem díky za nápady!!:-) 

    pondělí 23. dubna 2012 6:51

Odpovědi

  • Jsou v zásadě 3 možnosti:
    1) Buď si do třídy Words přidáte ještě jednu read only property, která vrátí ta dvě slova, a ListBoxu nastavte DisplayMemberPath na název této vlastnosti.

    public class Words
    {
        public string First { get; set; }
        public string Second { get; set; }
    
        public string Both 
        {
            get { return First + " " + Second; }
        }
    }

    2) DisplayMemberPath nenastavujte a místo toho přepište metodu ToString tak, aby vracela to, co potřebujete. ListBox vezme objekty, které jsou uvnitř, a zavolá na nich ToString - výsledek pak zobrazí jako položku seznamu, pokud tedy nepoužijete šablonu.

    public class Words { public string First { get; set; } public string Second { get; set; } public override string ToString()
    { return First + " " + Second;
    } }

    3) Napište si šablonu, kde nadefinujete, jak konkrétně to má vypadat.

    <ListBox ...>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock TextWrapping="Wrap">
                    <Run Text="{Binding First}" />
                    <Run Text=" " />
                    <Run Text="{Binding Second}" />
                </TextBlock>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    Píšu to z hlavy, tak snad to bude dobře.

    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz

    • Označen jako odpověď Matěj Hireš úterý 24. dubna 2012 9:04
    úterý 24. dubna 2012 6:12
    Přispěvatel

Všechny reakce

  • Zdravím, 

    použij List<Words>. Do toho pak budeš přidávat tuto třídu, která může mít jakékoli hodnoty. Potom při výpisu procházej všechny hodnoty v tomto listu a vypisuj konkrétní parametry z každé třídy... :-)

    pondělí 23. dubna 2012 15:20
  • Jsou v zásadě 3 možnosti:
    1) Buď si do třídy Words přidáte ještě jednu read only property, která vrátí ta dvě slova, a ListBoxu nastavte DisplayMemberPath na název této vlastnosti.

    public class Words
    {
        public string First { get; set; }
        public string Second { get; set; }
    
        public string Both 
        {
            get { return First + " " + Second; }
        }
    }

    2) DisplayMemberPath nenastavujte a místo toho přepište metodu ToString tak, aby vracela to, co potřebujete. ListBox vezme objekty, které jsou uvnitř, a zavolá na nich ToString - výsledek pak zobrazí jako položku seznamu, pokud tedy nepoužijete šablonu.

    public class Words { public string First { get; set; } public string Second { get; set; } public override string ToString()
    { return First + " " + Second;
    } }

    3) Napište si šablonu, kde nadefinujete, jak konkrétně to má vypadat.

    <ListBox ...>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock TextWrapping="Wrap">
                    <Run Text="{Binding First}" />
                    <Run Text=" " />
                    <Run Text="{Binding Second}" />
                </TextBlock>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    Píšu to z hlavy, tak snad to bude dobře.

    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz

    • Označen jako odpověď Matěj Hireš úterý 24. dubna 2012 9:04
    úterý 24. dubna 2012 6:12
    Přispěvatel
  • Děkuji Tomáši za naprosto dokonalou odpověď
    úterý 24. dubna 2012 9:05