Diskuze: Binding do dvou listBoxů

C# .NET .NET (C# a Visual Basic) Binding do dvou listBoxů American English version English version

Avatar
1001001
Člen
Avatar
1001001:

Ahoj řeším takovou drobnost. Má aplikaci diář ve wpf a mám problém s bindingem.

<StackPanel Orientation="Vertical" DataContext="{Binding ElementName=listDnes,Path=SelectedItem}">
                <StackPanel>
                    <TextBlock Text="Název události:" HorizontalAlignment="Center"/>
                    <TextBlock Text="{Binding Nazev}" HorizontalAlignment="Center"/>
                </StackPanel>
                <StackPanel>
                    <TextBlock Text="Datum události:" HorizontalAlignment="Center"/>
                    <TextBlock HorizontalAlignment="Center" Text="{Binding Datum, StringFormat=dd.MM.yyyy}"/>
                </StackPanel>
                <StackPanel>
                    <TextBlock Text="Priorita události:" HorizontalAlignment="Center"/>
                    <TextBlock Text="{Binding Priorita}" HorizontalAlignment="Center"/>
                </StackPanel>
                <StackPanel>
                    <TextBlock Text="Text události:" HorizontalAlignment="Center"/>
                    <TextBlock Text="{Binding Text}" HorizontalAlignment="Center"/>
                </StackPanel>
            </StackPanel>

Toto funguje bez problému. Když kliknu na událost v listboxu "Dnes" zobrazí se data v detailech události. Ale nevim jak to mám udělat pro ten druhy listBox "Zitra", aby se to taky zobrazilo v těch detailech.

Obrázky z apky:

Editováno 1.1.2014 19:03
 
Odpovědět 1.1.2014 19:02
Avatar
coells
Redaktor
Avatar
coells:

Co kdybys místo popisu toho, co funguje, popsal, co nefunguje?

  1. Ten tvůj kód je zjevně správně, takže kde je problém?
  2. Co přesně potřebuješ?
 
Nahoru Odpovědět 1.1.2014 19:40
Avatar
1001001
Člen
Avatar
1001001:

Přesně potřebuji to aby se mi detail události zobrazil i když kliknu na událost v listBoxu "Zítra".
Funguje mi jenom ten první listbox.

potřebuji nějak upravit toto:

<StackPanel Orientation="Vertical" DataContext="{Binding ElementName=listDnes,Path=SelectedItem}">

nějak přidat element pro listZitra asi nějak tak:

DataContext="{Binding ElementName=listDnes,Path=SelectedItem} DataContext="{Binding ElementName=listZitra,Path=SelectedItem} ">

Jenže to nefunguje dát je takhle vedle sebe.

 
Nahoru Odpovědět 1.1.2014 19:47
Avatar
1001001
Člen
Avatar
1001001:

Jestli existuje nějaký duální element nebo něco podobného?

 
Nahoru Odpovědět 1.1.2014 19:59
Avatar
coells
Redaktor
Avatar
Odpovídá na 1001001
coells:

Takže abych tomu porozuměl:

  1. když uživatel vybere prvek v listu dnes, tak zobrazíš detail dneška
  2. když uživatel vybere prvek v listu zítra, tak zobrazíš detail zítřka

Je to tak? Pokud ano, pak si můžeš udělat vlastní DependencyProperty AnySelectedItem a uděláš event handler na SelectionChanged přibližně takhle:

public void List_SelectionChanged(DependencyObject d, EventArgs e)
{
  ListBox list = (ListBox)d;
  this.AnySelectedItem = list.SelectedItem;
}

Detail si pak binduj na svoji property AnySelectedItem.

Ale musím tě varovat, že tohle je špatně navržený interface a jde to přímo proti HIGu. Jestliže máš více ovládacích prvků, které mezí sebou sdílí "selection" a focus, bude se to chovat nelogicky a mást uživatele. Určitě budeš muset upravit defaultní chování ListBoxů, aby se to chovalo alespoň trochu rozumně.

 
Nahoru Odpovědět 1.1.2014 20:00
Avatar
1001001
Člen
Avatar
Odpovídá na coells
1001001:
  1. když uživatel vybere prvek v listu dnes, tak zobrazíš detail dneška
  2. když uživatel vybere prvek v listu zítra, tak zobrazíš detail zítřka

přesně tak (sorry nevím jak se cituje) :D

zkusím zatím díky

 
Nahoru Odpovědět 1.1.2014 20:03
Avatar
coells
Redaktor
Avatar
Odpovídá na 1001001
coells:

Ano, existuje ekvivalent Bindingu pro více hodnot - MultiBinding. Jenže ten použít nemůžeš, protože jsi závislý na focused elementu.

Příklad, kdy ti to nebude fungovat a proč je to proti HIG:

  1. vyber událost z dneška
  2. vyber událost ze zítřka
  3. bez myši použij tab/shift-tab pro přepnutí na dnešek a v tu chvíli se detail nezmění, ale budeš mít vyznačenou zcela jinou událost.
 
Nahoru Odpovědět 1.1.2014 20:06
Avatar
1001001
Člen
Avatar
1001001:

Jo MultiBinding jsem zkoušel.
Díky moc za pomoc, přepisuji diář z windows forms applications a musím říct že tam to bylo teda totálně easy. :) Ve wpf je to teda težší. :)

Editováno 1.1.2014 20:22
 
Nahoru Odpovědět 1.1.2014 20:20
Avatar
1001001
Člen
Avatar
1001001:

Tak zkusil jsem popřemýšlet nad tímto zadáním a moc mi to není jasné mohl bys mi prosím trochu přiblížit jaké příkazy mám realizovat do XAMLu?

 
Nahoru Odpovědět 1.1.2014 21:47
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.