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 ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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ě.

1
2
3
4
5
6
7
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

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