Binding na user control s user property   zodpovězená otázka

C#, WPF, Silverlight

VS2012 Pro, .NET 4.5 WPF

Dobrý den,

v projektu mám objekt(INotifiPropertyChanged) s bool vlastností Value ta se mění (dle připojeného zařízení). Při každé změně vyvolá událost PropertyChanged (ověřeno v debug).

Pokud na ToggleButton a jeho vlastnost IsChecked nabinduji tento objekt s vlastnost Value.

Tak se stisknutí togglebuttonu mění správně, podle vlastnosti Value (OK).

Naspal jsem si jednoduchý control "Lamp" děděný od Image s bool vlastností LampStatus a naprosto shodným způsobem jsem nabindoval tento control.

Vlastnost LampStatus se, ale nechce měnit.

Pokud ji měním bez bindování, z kódu tak control pracuje jak má.

Věděl by někdo kde dělám chybu ?

    public class Lamp : System.Windows.Controls.Image
    {

        public static DependencyProperty ImageOnDependencyProperty = DependencyProperty.Register("ImageOn",
                                                                                                 typeof(ImageSource),
                                                                                                 typeof(Lamp),
                                                                                                 new PropertyMetadata(null));
        [Category("Images")]
        public ImageSource ImageOn
        {
            get { return (ImageSource)GetValue(ImageOnDependencyProperty); }
            set { SetValue(ImageOnDependencyProperty, value); }
        }

        public static DependencyProperty ImageOffDependencyProperty = DependencyProperty.Register("ImageOff",
                                                                                                 typeof(ImageSource),
                                                                                                 typeof(Lamp),
                                                                                                 new PropertyMetadata(null));
        [Category("Images")]
        public ImageSource ImageOff
        {
            get { return (ImageSource)GetValue(ImageOffDependencyProperty); }
            set { SetValue(ImageOffDependencyProperty, value); }
        }

        public static DependencyProperty LampStatusDependencyProperty = DependencyProperty.Register("LampStatus",
                                                                                                 typeof(bool),
                                                                                                 typeof(Lamp),
                                                                                                 new PropertyMetadata(null));
        [Category("Control")]
        public bool LampStatus
        {
            get { return (bool)GetValue(LampStatusDependencyProperty); }
            set
            {
                Source = value ? ImageOn : ImageOff;
                SetValue(LampStatusDependencyProperty, value);
            }
        }
    }
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Problém je v tom, jak pracujete Dependency Property. Dependency Property se definuje pomocí funkce Register(). Vytvoření běžné vlastnosti {get; set;} je již nepovinné a slouží pouze pro nastavení hodnoty z kódu. To znamená že při bindování (nebo i při animování vlastnosti) se setter vůbec nevolá, hodnota je nastavena přímo. Setter ani getter by nikdy neměl obsahovat nic jiného než volání GetValue() a SetValue().

Pokud chcete odchytit změnu vlastnosti, můžete při registrování DependencyProperty předat callback, který se zavolá vždy při změně.

 DependencyProperty TestProperty =
            DependencyProperty.Register("Test", typeof(string), typeof(MainWindow), new PropertyMetadata("defaultValue", onTestChanged));

        private static void onTestChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {

        }

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jen je škoda, že metoda onTestChanged je statická, ale je to logické, protože dependencyproperty, která ji registruje je také statická.

Děkuji za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback