NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Získání ListBoxItemu

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Luboš Hnědý:15.9.2017 11:25

Zdravím mám tento XAML kód. Dělám to ve WPF

<ListBox x:Name="tasks" Margin="0">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Label Grid.Column="0" x:Name="idLabel" Content="{Binding IDLabelContent}" Visibility="Hidden"/>
                        <Label Grid.Column="0" x:Name="contentLabel" Content="{Binding ContentLabelContent}"/>
                        <Label Grid.Row="1"  x:Name="dateLabel" Content="{Binding DateLabelContent}"/>
                        <Label Grid.Row="1" x:Name="nameLabel" Grid.Column="1" Content="{Binding NameLabelContent}"/>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Vím jak dostat nový item do listboxu, ale mám problém, že nevím jak dostat label z tohoto listboxu. Budu rád za každou radu díky.

 
Odpovědět
15.9.2017 11:25
Avatar
Neaktivní uživatel:15.9.2017 13:24

Ahoj,
napriklad takto:

Metoda:

private ChildControl FindVisualChil­d<ChildControl>(De­pendencyObject DependencyObj) where ChildControl : DependencyObject
{
for (int i = 0; i < VisualTreeHel­per.GetChildren­Count(Dependen­cyObj); i++)
{
DependencyObject Child = VisualTreeHel­per.GetChild(De­pendencyObj, i);

if (Child != null && Child is ChildControl)
return (ChildControl)Chil­d;
else
{
ChildControl ChildOfChild = FindVisualChil­d<ChildControl>(Chil­d);

if (ChildOfChild != null)
return ChildOfChild;
}
}
return null;
}


Pouzitie, napr. v evente SelectionChanged:

ListBoxItem selectedItem = tasks.ItemCon­tainerGenerator­.ContainerFro­mItem(this.tas­ks.SelectedItem) as ListBoxItem;

ContentPresenter contentPresenter = FindVisualChil­d<ContentPresen­ter>(selectedI­tem);
DataTemplate yourDataTemplate = contentPresen­ter.ContentTem­plate;

Label foundLabel = yourDataTempla­te.FindName("id­Label", contentPresenter) as Label;

Nahoru Odpovědět
15.9.2017 13:24
Neaktivní uživatelský účet
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Luboš Hnědý
Petr Nymsa:15.9.2017 13:33

A k čemu potřebuješ získat ten Label? Jestli na to, co potřebuješ udělat, nejdeš obráceně. Pokud do ListBoxu binduješ kolekci objektů, lze vždycky vědět, jaký prvek je zrovna vybraný a není problém pak jednotlivé vlastnosti objektu (které binduješ v dataTemplate do Labelů) získat.

Nahoru Odpovědět
15.9.2017 13:33
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Luboš Hnědý:15.9.2017 13:46

Miroslav Majcher - Díky za odpověď jenom mi to připadá složíté... Ale určitě děkuju moc
Petr Nymsa - Potřebuju z těchto labelu získat Content a Id abych to mohl přidat do databáze. Šlo by to nějak ?

 
Nahoru Odpovědět
15.9.2017 13:46
Avatar
Odpovídá na Luboš Hnědý
Neaktivní uživatel:15.9.2017 13:57

Ahoj,
zlozite ano, ale pytal si sa, ako sa dostat k labelu. Pokial chces z neho ziskat id, tak potom je riesenie, ktore navrhuje Petr Nymsa. Uplne jednoducho cez SelectedItem, len musis pretypovat na prislusny typ.

M.

Nahoru Odpovědět
15.9.2017 13:57
Neaktivní uživatelský účet
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Luboš Hnědý
Petr Nymsa:15.9.2017 13:57

Koukni se po zdejších tutoriálech po Bindingu a případně MVVM. Jde ti o to, že pokud budeš umisťovat a vázat kód přímo na View (typicky v CodeBehind), tak při jakkékoliv změně UI budeš nucen měnit i veškerou logiku ukládání dat apod. (např: co když nebude data vybírat z ListBoxu ale z nějakého Gridu a nebudeš tam mít Labely ale jinou komponenut, apod).

Nebudu to celé rozvádět, ale pro tvoje View (.xaml) si vytvoříš ViewModel, který bude mít kolekci tvých dat (objektů). Každý objekt má vlastnosti, které budeš bindovat v DataTemplate ListBoxu.
Zároveň na ListBoxu nabinduješ obousměrně vlastnost SelectedItem, tím pádem budeš vědět, který objekt je právě vybrán a jsi schopen si vytáhnout veškeré informace, které potřebuješ.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
15.9.2017 13:57
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Luboš Hnědý:16.9.2017 20:33

Jo díky za radu moc nevim jak to zvládnu ale díky.

 
Nahoru Odpovědět
16.9.2017 20:33
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Luboš Hnědý
Petr Nymsa:17.9.2017 7:57

Koukni na ty navody zde na siti. Az budes mit neco konkretnejsiho, poradim co dal. Kdyz ti tu jen napisu cele reseni tak to asi uplne nepomuze.

Nahoru Odpovědět
17.9.2017 7:57
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Luboš Hnědý:17.9.2017 15:31

Tak jsem to dokázal a myslím si že celkem správně. :) Díky že si mi poradil jk na to :)

 
Nahoru Odpovědět
17.9.2017 15:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.