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í.
Avatar
labyMan
Neregistrovaný
Avatar
labyMan:14.11.2013 19:31

Ahoj, snažím se Bindovat ale nějak to nefunguje, kód bych měl mít snad dobře, aplikace se normálně spustí.

<phone:PhoneApplicationPage xmlns:local="clr-namespace:MyGrades"..../>
 <phone:PhoneApplicationPage.Resources>
        <DataTemplate x:Key="Data"/>
    </phone:PhoneApplicationPage.Resources>
<Grid>
 <ListBox Background="Red" ItemsSource="{Binding Path=Numbers}" ItemTemplate="{StaticResource Data}" />
</Grid>

a ve třídě MainViewModel

private List<int> numbers;
       public MainViewModel()
       {
           this.numbers = new List<int>() { 1, 2, 3, 4, 5 };


       }
       public List<int> Numbers
       {
           get { return this.numbers; }
           set { this.numbers = value;}
       }

Nevíte někdo, v čem je problém? Díky

 
Odpovědět
14.11.2013 19:31
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na
Petr Nymsa:14.11.2013 19:39

Ihned několik věcí zvláštně

  1. Proč definuješ prázdný DataTemplate, který následně nastavíš jako template pro ListBox
  2. Aby se podařilo napojit na List Numbers, musíš nastavit Controlu ListBox nebo třeba celému Page - DataContext
  3. Souvisí s 1. Nastavil jsi rpázdný DataTemplate, tudíž nemá co zobrazovat
  4. Místo kolekce List využívej ObservableCollec­tion<T> - zajistí automatický refresh - proto Binding
  5. Pro jiné Properties musíš třídě implementovat INotifyProper­tyChanged

Toť rychlý info. Ptej se čemu přesně nerozumíš :)

Nahoru Odpovědět
14.11.2013 19:39
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
labyMan
Neregistrovaný
Avatar
Odpovídá na Petr Nymsa
labyMan :14.11.2013 19:48

díky, díky, ale stále nerozumím jak nastavit ten ListBox

 
Nahoru Odpovědět
14.11.2013 19:48
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na
Petr Nymsa:14.11.2013 20:44

Nemůžu ti tu popsat celý systém DataBindingu. Takže to vezmu bodově :). Zaprvé se koukni na pattern MVVM (Model-View-ModelView).

Každá property, kteoru chceš bindovat musí být public s přístupem pro GET i SET. V Bindingu pomocí Mode lze nastavit chování
OneTime - pouze při první incializaci, měna property se neprojeví v komponentě
OneWay - pouze z Modelu do View
TwoWay - oboustranná závislost, tedy změna v Modelu se projeví ve View, naopak změna ve View se projeví do Modelu. Typicky například TextBox

Třídy kde chceš zajistit Binding musí implementovat rozhraní INotifyProper­tyChanged. Pokud chceš více, info řekni si.

K tvému problému konkrétně. DataTemplate je pro tvůj případ zbytečný. DataTemplate slouží pro určení "vzhledu" jednotlivých Itemů. K problému. Mám ObservableCollec­tion<int>. Ne List ! ObservableCollec­tion ti zajistí správný chod Bindingu (není potřeba u kolekce tedy dále řešit PropertyChanged)
Ve třídě MainPage (pro demonstraci stačí, obecně velmi špatný návrh ! )

public ObservableCollection<int> Numbers { get; set; }

a konstrutktor

// Celé Page řeknu že veškerá data jsou dostupná pouze v této třídě
           // this.DataContext = this;
           //nebo řeknu že DataContext pro ListBox je tato třída.

           this.Numbers = new ObservableCollection<int>();
           this.DataContext = this;

           for (int i = 0; i < 11; i++)
           {
               Numbers.Add(i);
           }

Kolekci naplním od 0 do 10 (žádná věda). Důležitý je řádek DataContext. každá property )nebo téměř každá) má vlastnost DataContext. Tím říkáš odkud dané data můžeš čerpat. Takže našemu oknu jsme nastavil DataContext na třídu okna. Tím jsem řekl že veškerá data bude brát z této třídy a případně dalších instancí ve třídě.

No a odpovídající XAML

<ListBox x:Name="listBox" ItemsSource="{Binding Numbers}" />
Nahoru Odpovědět
14.11.2013 20:44
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Jakub Lásko[Saarix]:15.11.2013 12:08

Zvláštní, že jsem tu zatím prakticky nikoho neviděl u Bindingu používat Path... já ji používám skoro vždy.

Př.

<TextBox Text="{Binding Path=Author, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"
                     Grid.Column="1" Grid.Row="2" FontSize="16" />

A somzřejmě u Gridu nastavím source.

DataContext="{Binding ElementName=diaryData, Path=SelectedItem, Mode=OneWay}"
;)
Nahoru Odpovědět
15.11.2013 12:08
Časem je vše možné.
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Jakub Lásko[Saarix]
Petr Nymsa:15.11.2013 19:21

Jasně :) ale ne vždy Path lze použít. Opět v tomto příkladě to také nelze použít.

Nahoru Odpovědět
15.11.2013 19:21
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 6 zpráv z 6.