Jak pisu v nazvu s DP jsem jeste nepracoval takze bych to na prikladu chtel pochopit.
Mam kod
public partial class MainWindow : Window
{
Uzivatel prihlasenyTechnik = null;
private void ObnovTlacitka()
{
grid_Tlacitka.Children.Clear();
foreach (SubPolozkaPolozka spp in lspp)
{
RowDefinition _rd = new RowDefinition();
Agenda _agenda = new Agenda(ref _Entita, spp, _rd.Height, prihlasenyTechnik);
grid_Tlacitka.RowDefinitions.Add(_rd);
grid_Tlacitka.Children.Add(_agenda);
Grid.SetRow(_agenda, ir);
Grid.SetColumn(_agenda, ic);
}
}
Agenda je userControl ve kterem je mimo jine tlacitko ja bych se potreboval dozvedet zdali prihlasenyTechnik byl v dobe kliku na nektere z mnoha tlacitek nastaven a nebo byl NULL
A tak jsem do toho UserControlu Agenda pridal
public static readonly DependencyProperty PrihlasenyUzivatel = DependencyProperty.Register("prihlasenyTechnik", typeof(Uzivatel), typeof(MainWindow));
a v handleru toho tlacitka se mi nevede nacist tu spravnou hodnotu - nejak tomu celkove nerozumim, kde je chyba prosim
Snad je popis problemu srozumitelny
diky
Nahlásit jako SPAM
IP: 89.24.14.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset!
Co přinese programátor??
buď ti tady v té ukázce kus kódu schází, nebo jsem přesně nepochopil zadání. Nikde nevidím, jak s tou vlastnosti pracuješ. Každopádně, pro DP platí, že nemůžeš manipulovat s vlastností přes Setter, ale využít delegáty na té DP - když ji deklaruješ.
Pěkný den,
Nahlásit jako SPAM
IP: 213.192.30.–
MCAD, MCPD
http://jirava.net/blog
http://xaml.cz - Magazín moderních technologií založených na XAML
jsem na tom obdobně jako Jarda. Buď si nám neposlal Propertu PrihlasenyUzivatel kvůli tomu, že je to zřejmé a chyba je jinde a nebo ti tam chybí.
public Uzivatel PrihlasenyUzivatel
{
get { return (Uzivatel)GetValue(PrihlasenyUzivatelProperty); }
set { SetValue(PrihlasenyUzivatelProperty, value); }
}
// Using a DependencyProperty as the backing store for PrihlasenyUzivatel. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PrihlasenyUzivatelProperty =
DependencyProperty.Register("PrihlasenyUzivatel", typeof(Uzivatel), typeof(MainWindow), new UIPropertyMetadata(null));
Doporučuji se neučil syntaxi nazpaměť ale využít snippety. Na toto existuje snippet "propdp". Pokud neznáš snippety, tak doporučuji gůgl. Zkráceně stačí říci, že do VS napíšeš "propdp" zmáčkneš 2x tab a ono ti to doplní většinu kódu.
snipety pouzivam ale fakt je zo propdp jsem nevedel, nejspis to bude tim ze mi unika jak vlastne spravne s DP pracovat. A navic nevim jestli pro uvedeny priklad je to to spravne pouziti takze se asi nedivim ze priklad je vice ci mene nepochopitelny.
Popisu tedy slovy co potrebuji. - POZOR PrihlasenyUzivatel a prihlasenyTechnik je jedna a ta sama properta(chyba pri psani toho prispevku)
Mam MainWindow dedenou z Window a do tohoto objektu dynamicky vytvarim UserControly dle typu Agenda. Tento user control ma v sobe mimo jine tlacitko s click handlerem do codebehind toho usercontrolu. Potud si myslim ze je vse zpravne.
V main window mam propertu PrihlasenyTechnik a v okamziku kdy klikam na nektere z mnoha tlacitek tech userControlu tak se potrebuji dozvedet ktery technik je prihlaseny.
V dobe konstrukce MainWindow - generovani tech Agend do MainWindow zadny technik prihlaseny neni Properta je NULL a behem bezneho chodu programu se prihlasuji ruzní technici a jejich zivotnost je pouze na 1 klik do nektereho z tech UserControlu Agenda po te co se vykona akce nad tlacitkem tak se uvedeny technik automaticky odhlasi.
Je to srozumitelne? Proste na MainWindow se prihlasi v nektere z Agend se zpracuje a nasledne zrusi aby se mohl prihasit jiny technik ktery klika na jinou instanci Agendy.
Nahlásit jako SPAM
IP: 89.24.18.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset!
Co přinese programátor??
Osobně nemám rád tento způsob užívání WPF, já vše jedu přes MVVM pattern a toto řeším ve ViewModelu místo v code-behind.
Pravda, ne vše lze řešit takto, někdy se tvorbě kontrolky nevyhneš.
Já s dependency property mel taky problémy, ale vykoukal jsem to na codeplexu, třeba na úpravě jednoduchých textBoxů.
S propdp pracuješ pouze přes propertu, která má v getteru a setteru getValue/setValue na tu dependency propertu. Já spíš využívám toho, že toto pak můžeš nastavovat pres XAML.
Doporučuji omrknout http://wpftoolkit.codeplex.com , máš zde k dispozici zdrojáky a z toho jsem to pochopil nejlépe :-)
Čím více nad tím přemýšlím tím více docházím k názoru že zde uvedeny příklad se prostřednictvím DP nedá nebo je nevhodné řešit prostřednictvím DP.
Je to tak ???
Cele jsem to vyřešil tak že jsem do konstruktoru toho UserControlu Agenda vlozil instanci toho MainWindow a pak se v code-behing můžu dotázat Uzivatel u = MainWindow.PrihlasenyTechnik;
Program mi běží ale DP jsem zatim nepochopil , zkouknu ten codeplex.
Každopadně všem Díky
Nahlásit jako SPAM
IP: 89.24.17.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset!
Co přinese programátor??
Do DP neukládáš např. Hodnoty true a false, ale předáš mu klasickou propertu, která bude typu bool. DP pak umí vytahovat hodnoty z předané property a při změně notifikuje o tom, ze bylo něco změněno.
Výhoda je, ze lze využívat binding, což právě u MVVM masivně vyuzivas :-)
Možná to takhle zní podivné k čemu to je, ale ty místo abys text boxu nastavil třeba readOnly na true, tak tuto vlastnost propojíš přes binding s jinou propertou ve ViewModelu a pokud ji nastavíš na true, tak se text box stane readOnly. Výhodou je, ze to funguje i oboustranně, takže probindovany text na text boxu ti po napsání hodnoty a opuštění txtBoxu vystřelí ve viewModelu, že text v text boxu byl změněn a ty na to můžeš reagovat.
Prakticky pak vůbec nepoužíváš události na komponentách jen hlídá s změny probindovanych properties. Výhoda je čistý návrh a oddělení vrstev. Snadno pak vyměňuješ komponenty na prezenční vrstvě.
Ale to už jsme u MVVM a jestli tě to zajímá, tak mrkni na web Jardy Jiravy,
zkusím to lehce objasnit, ale ber to jako skutečně lehké objasnění DP. Na takto deklarovanou vlastnost můžeš vztáhnout nějakou závislost nebo ji spíše svázat s daty. Takto deklarovaná vlastnost má ve vztahu s WPF další chování, které pomáhá při sestavování UI. Jak již bylo řečeno dříve, je to jak binding na data, tak také možnost použít takovou vlastnost třeba ve stylech.
Pro tvůj případ bych však rozlišoval mezi prezentační logikou a logikou aplikace. Čeho chceš dosáhnout je spíš logika aplikace, jakým způsobem se má chovat, než o samotné prezentaci těchto dat. A jak tady již bylo zmíněno, změna technika je tedy spíše změnou ve ViewModelu. Tohoto technika pak klidně můžeš mít přes nějakou DP přiřazenu k zobrazování, ale může to být i jen přes klasickou vlastnost z objektu implementující INotifyPropertyChanged.
Pěkný den,
Nahlásit jako SPAM
IP: 77.78.85.–
MCAD, MCPD
http://jirava.net/blog
http://xaml.cz - Magazín moderních technologií založených na XAML
Přesně takto jsem to následně pochopil a tím zkonstatoval že DP pro změny v modelu, které v konečném důsledku nemají mít vliv na vzhled, nejsou tím pravým ořechovým nástrojem.
Nahlásit jako SPAM
IP: 89.24.14.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset!
Co přinese programátor??