IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Událost volaná při přidání itemu do ListBoxu

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

Aktivity
Avatar
Petr Klekner
Člen
Avatar
Petr Klekner:17.9.2017 15:38

Zdravím mám jeden problém. Mám listbox a v něm samozřejmě nějaké itemy a mam tlačítko na přidání a na odstranění. Nyní to dělám tak že mám událost Aticvated na Window a vždycky listbox smažu a přidam znova itemy. Chtěl bych to udělat nějak jinak neexistuje nějaká událost na přidání a smazání ? Díky moc za odpověď

 
Odpovědět
17.9.2017 15:38
Avatar
Neaktivní uživatel:17.9.2017 15:55

Ahoj,

  1. preco pouzivas Activated, nie je OnLoaded lepsie, kvoli tomu, ze su vsetky UI komponenty uz nacitane.
  2. predpokladam, ze je tam nejaka navaznost na predchadzajuce vlakno. Pokracujes s pouzitim MVVM? Ak ano, tak urcite vyuzivas ObservableCollec­tion<T>, ktora je bindovana do listboxu a ktora ma Event CollectionChanged s enumom, aka zmena sa vykonala.

M.

Nahoru Odpovědět
17.9.2017 15:55
Neaktivní uživatelský účet
Avatar
Petr Klekner
Člen
Avatar
Odpovídá na Neaktivní uživatel
Petr Klekner:17.9.2017 16:04

Používám List vadí to ? A záznamy do listboxu načítám právě v metodě Activated z Listu a Activated používám protože OnLoaded se spustí jenom při načtení okna právě proto hledám nějakou logičtější alternativu. A to bindování mám použít přímo v XAML ?

 
Nahoru Odpovědět
17.9.2017 16:04
Avatar
Odpovídá na Petr Klekner
Michal Štěpánek:17.9.2017 16:09

Když použiješ ObservablCollec­tion, usnadníš si život...

Nahoru Odpovědět
17.9.2017 16:09
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Petr Klekner
Člen
Avatar
Odpovídá na Michal Štěpánek
Petr Klekner:17.9.2017 16:13

Dobře dobře už googluju :) Takže to použiji a potom si nastavím bindování, které si bude brát ty záznamy z kolekce a když něco přidám nebo odeberu tak použiji událost CollectionChanged a listbox se upraví ?

 
Nahoru Odpovědět
17.9.2017 16:13
Avatar
Odpovídá na Petr Klekner
Michal Štěpánek:17.9.2017 16:14

Netřeba gůglit, stačí se mrknout na tutorial zde na síti

Nahoru Odpovědět
17.9.2017 16:14
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Petr Klekner
Člen
Avatar
Odpovídá na Michal Štěpánek
Petr Klekner:17.9.2017 16:24

A mohl by si mi ho prosím poslat ?

 
Nahoru Odpovědět
17.9.2017 16:24
Avatar
Odpovídá na Petr Klekner
Michal Štěpánek:17.9.2017 17:48

Projdi si tutorial na c# wpf nebo si vyhledej observablecollec­tion

Nahoru Odpovědět
17.9.2017 17:48
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Petr Klekner
Člen
Avatar
Odpovídá na Michal Štěpánek
Petr Klekner:18.9.2017 13:25

Jo super už jsem to našel díky moc. :) Ale mam ještě jeden problém.. V ListBoxu mám šablonu ve které mám 2 Labely a jejich Content je bindovanej a nevím jak to mám udělat... Protože teď když binduju tu kolekci tak se bere metoda ToString()

 
Nahoru Odpovědět
18.9.2017 13:25
Avatar
Petr Klekner
Člen
Avatar
Odpovídá na Michal Štěpánek
Petr Klekner:18.9.2017 13:27

A ještě jedna věc potřeboval bych do kolekce přidávat i ID právě přidaného záznamu to mám udělat tak že si pro to id sáhnu do databáze ? Jinak to asi nepude ne

 
Nahoru Odpovědět
18.9.2017 13:27
Avatar
Odpovídá na Petr Klekner
Neaktivní uživatel:18.9.2017 14:12

Pokial bindujes kolekciu, tak nastav binding labelu na konkretnu property, tj. napr: Content="{Binding Id}", atp.

ps: odporucany tutorial si uz presiel?

Nahoru Odpovědět
18.9.2017 14:12
Neaktivní uživatelský účet
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Petr Klekner
Petr Nymsa:18.9.2017 18:15
<ListView>
        <ListView.ItemTemplate>
                <DataTemplate>
                        <Grid>
                                <!-- definice napr. sloupcu -->
                                <Label Text={Binding Name} /> <!-- Name je vlastnost bindovaneho objektu -->
                        </Grid>
                </DataTemplate>
        <ListView.ItemTemplate>
<ListView>

Pokud použiješ, jak už ostatní psali, ObservableCollec­tion máš změnu o přidání / mazání prvků postaráno. ID musíš mít vždy v paměti načtené u tvých objektů (jak by jsi hledal ID v databázi? když ID je jednoznačně určující vlastnost záznamu?). Samozřejmě ID není nutné nijak zobrazovat ;)

Nahoru Odpovědět
18.9.2017 18:15
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Klekner
Člen
Avatar
Odpovídá na Neaktivní uživatel
Petr Klekner:18.9.2017 21:23

Díky za odpověď. ano tutorial jsem našel a je to fkt skvělý :) Díky moc. Bindování u Labelu mám ale netuším jak to použít jak řikám nyní se do listboxu bindujou data z kolekce pomocí ToString a já fkt netušim jak to udělat že to dosadím do Labelu.

A Petr Nymsa s tím id jsem to udělal tak že si nejdříve uložím záznam do databáze a poté si tento záznam z databáze vezmu a přidám do kolekce je to tk v pohodě ? Protože jaký mám přidat ID k objektu když nevím jaké je v databázi ? Si prostě musím vzít s tý databáze ne ?
Díky všem za pomoc

 
Nahoru Odpovědět
18.9.2017 21:23
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Petr Klekner
Petr Nymsa:18.9.2017 21:32
  1. jak jsem psal, u listview /listbox atd muzes upravit item template
  2. pokud samozrejme jeste id neznas tak si ho musis vytahnout z db.
Editováno 18.9.2017 21:33
Nahoru Odpovědět
18.9.2017 21:32
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Klekner
Člen
Avatar
Odpovídá na Petr Nymsa
Petr Klekner:18.9.2017 21:40

Okok to já chápu já ale pak nechápu jak to mám pak přidat tomu labelu ten text z tý kolekce ? Mám to nastavit v xaml nebo přímo v kódu ? Jserm fkt ztracenej omlouvám se...

 
Nahoru Odpovědět
18.9.2017 21:40
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Petr Klekner
Petr Nymsa:18.9.2017 22:31

Četl sis zdejší tutoriály? Napisu strucne kod.
Dejme tomu, že máme objekt Person

class Person
 {
public int id {get; set}
public string Name {get; set; }
 }

Vytvoris PersonsPageVi­ewModel, kde budes mit logiku pro zobrazeni / mazani lidi apod.
Vytvorime si kolekci ObservableCollec­tion<Person>

class PersonsPageViewModel : INotifyPropertyChanged
{
    /* Implementaci rozhrani INotifyPropertyChanged vynechavam, predokladejme ze metodou OnPropertyChanged vyvolam zmenu (+ "trik" s CallerMemberName) */
    public ObservableCollection<Person> Persons {get; set;}
    private Person _selectedItem;
   public Person SelectedItem
   {
        get {return _selectedItem; }
        set
        {
                _selectedItem = value;
                OnPropertyChanged();
        }
   }
    PersonsPageViewModel()
        {
                Persons = // .. testovaci data
        }
}
public PersonsPage()
{
 InitializeComponent();
 this.DataContext = new PersonsPageViewModel();
 }

XAML

 // nejaka kostra View
 <ListView ItemsSource="{Binding Persons}" SelectedItem="{Binding SelectedItem}">
        <ListView.ItemTemplate>
                <DataTemplate>
                        <Grid>
                                <!-- definice napr. sloupcu -->
                                <Label Text={Binding Name} /> <!-- Name je vlastnost bindovaneho objektu -->
                        </Grid>
                </DataTemplate>
        <ListView.ItemTemplate>
<ListView>
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
18.9.2017 22:31
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Klekner
Člen
Avatar
Odpovídá na Petr Nymsa
Petr Klekner:19.9.2017 18:40

Jo super díky moc nějak jsem to dokázal. :) Omlouvám se, že jsem tak natvrdlý... Je tady fakt super komunita a děkuju za pomoc. Mam poslední otázku... Když teď budu potřebovat použít právě vybraný item v listboxu mám použí metodu SelectedItem, nebo si zavolat vlastnost SelectedItem z ModelView ? Díky moc za odpověď snad poslední...

 
Nahoru Odpovědět
19.9.2017 18:40
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Petr Klekner
Petr Nymsa:19.9.2017 21:05

Žádnou metodu SelectedItem nemáš. Komponenta ListView / ListBox,.. má vlastnost SelectedItem kterou pomocí bindingu propojuješ s tvým ViewModelem, kde máš také vlastnost SelectedItem. Pokud budeš chtít dejme tomu po zmáčknutí tlačítka zobrazit vybraný prvek, opět to uděláš skrz ViewModel.

Ve ViewModelu si vytvoříš metodu ShowSelectedI­temInfo()

 ShowSelectedItemInfo()
 {
 MessageBox.Show(SelectedItem.Name); // pro jednoduchost
}

Jak vyvolat metodu?

Prvni zpusob je v code-behind odposlouchavat event Clicked na tlacitku a potom neco ve stylu

((PersonViewModel)DataContext).ShowSelectedItemInfo();

Mnohem lepsi a elegantnejsi zpusob je pomoci ICommmand rozhrani. Diky tomu veskera logika zustane ve ViewModelu.

Nahoru Odpovědět
19.9.2017 21:05
Pokrok nezastavíš, neusni a jdi s ním vpřed
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 18 zpráv z 18.