Jak spravne pochopit DependencyProperty – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Jak spravne pochopit DependencyProperty – .NET – Fórum – Programujte.comJak spravne pochopit DependencyProperty – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
VladislavK0
Stálý člen
11. 5. 2013   #1
-
0
-

Ahoj tak jeste jeden poroblem.

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??
Reklama
Reklama
JardaJirava0
Stálý člen
11. 5. 2013   #2
-
+1
-
Zajímavé

Ahoj,

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
Evzen+2
Návštěvník
11. 5. 2013   #3
-
0
-

#2 JardaJirava
Ahoj,

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. 

Evžen

Nahlásit jako SPAM
IP: 88.101.117.–
VladislavK0
Stálý člen
12. 5. 2013   #4
-
0
-

Diky za odpoved

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??
Evzen+2
Návštěvník
12. 5. 2013   #5
-
0
-

Ahoj,

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 :-) 

Evzen

Nahlásit jako SPAM
IP: 88.101.117.–
VladislavK0
Stálý člen
12. 5. 2013   #6
-
0
-

Čí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??
Evzen+2
Návštěvník
12. 5. 2013   #7
-
0
-

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,  

Www.XAML.cz

Píšu to na tabletu, tak mi tu preskakujou písmenka/slova, a pokud je muj popis matoucí, tak se omlouvam, nejsem v tom úplná hvězda :-) 

Evzen

Nahlásit jako SPAM
IP: 88.101.117.–
JardaJirava0
Stálý člen
13. 5. 2013   #8
-
0
-

Ahoj,

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
VladislavK0
Stálý člen
13. 5. 2013   #9
-
0
-

Děkuji za vysvětlení

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??
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 70 hostů

Podobná vlákna

Jak pochopit zadání? — založil Ondřej Sládek

Jak správně programovat objektově GUI — založil mnawium mnawawia

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý