(WPF) Usercontrol custom Property bei Initialisierung in XAML



  • Hallo Leute,

    ich habe eine eigens Control (Dummy) gemacht unter WPF. Im CodeBehind habe ich ein

    class Dummy : UserControl
    {
    
    .....
    
     public TimeLineMode TimeMode{get;set;}
    }
    

    Property

    nun will ich wenn ich das Kontrol irgendwo in an einem anderen XAML Container verwende und diese mit

    <mycontrol:Dummy x:Name="test" TimeMode="Absolute"/>
    

    das Property initalisieren.

    Das Programm wird übersetzt, aber das Property hat nich den wert den ich erwarte. Irgendwie soll das mit Begin udn End Init gehen.. aber ich finde kein Beispiel im netz.

    Grund:

    Ich will mein Control in XAML verwenden, kann da aber meinem Control keine Konstruktor PArameter übergeben, deswegn msus ich es mit den Property machen.



  • ist dein TimeLineMode auch ein korrektes DependencyProperty ? wenn nicht wuerd ich mich wundern warum es baut #gg

    auf jeden fall solltest du ein default property im dp definieren
    es wird erst gesetzt wennd er ctor bereits durch ist - da wuesste ich auch kein umweg

    du kannst ja mit einem default initialisieren lassen, und dann beine callback methoden im dp definieren - dort kannst du dann nochmal neu initialisieren sobald das property rein kam



  • Ok danke Evil,

    ich hab das ganze jetzt so umgemodelt. Der Code-Behind teil hat nun ein DependesyProperty:

    class Dummy: UserControl{
    
     public Dummy()
    {
     	InitializeComponent();
    
           var t=TimeView; //HIER BRAUCH ICH DEN TimeVIEW WERT!
    ........
    }
    
    	// Dependency Property
    		public static readonly DependencyProperty CurrentTimeProperty =
    			 DependencyProperty.Register("TimeView", typeof(TimeLineMode),
    			 typeof(TrendControlHost), new FrameworkPropertyMetadata(TimeLineMode.Absolute));
    
    		// .NET Property wrapper
    		public TimeLineMode TimeView
    		{
    			get
    			{ 
    				return (TimeLineMode)GetValue(CurrentTimeProperty);
    			}
    			set
    			{ 
    				SetValue(CurrentTimeProperty, value); 
    			}
    		}
    

    Aber es funktioniert trozdem nich:( ist immer noch der Standart wert drin



  • den wirst du im ctor nie fertig bekommen - die properties werden - wie schon gesagt - erst _nach_ dem ctor aufgerufen -
    erstell eine "OnTimeViewChanged" methode und initialiere dann dort

    hier mal pseudo

    class Dummy : UserControl
    {
        public Dummy()
        {
            InitializeComponent();
    
            ReloadStuff(TimeView); // init mit dem default (Absolute)
        }
    
        public TimeLineMode TimeView
        {
            get { return (TimeLineMode)GetValue(TimeViewProperty); }
            set { SetValue(TimeViewProperty, value); }
        }
    
        public static readonly DependencyProperty TimeViewProperty =
    		DependencyProperty.Register("TimeView", typeof(TimeLineMode), typeof(Dummy), new UIPropertyMetadata(TimeLineMode.Absolute, OnTimeViewChanged));
    
        private static void OnTimeViewChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            Dummy control = d as Dummy;
            control.ReloadStuff((TimeLineMode)e.NewValue);
        }
    
        private void ReloadStuff(TimeLineMode timeLine)
        {
            ...
        }
    }
    

    im ctor wirst du nie den user gesetzten wert haben

    //edit, typos im code



  • Danle für den Code Evil,

    ABER d.h. wenn ich 100 solcher dependeny Properties habe, und alles initialisieren will, dann muss 100 mal "loadStuff" aufrufen? is das sin der sache???

    grüße



  • ja musst du (kannst ja die selbe "OnItemChanged" methode verwenden)
    der sinn ist aber eher so das man keine 100 properties hat {o;

    versuch das init am besten so auf zu teilen das du immer nur den relevanten teil aktualisierst

    es ist ja im prinzip kein initialisieren - das geschah ja schon mit den default werten, du machst dann nur noch ein aktualisieren von properties

    stell dir vor alle diese properties werden vom user eingegeben in textboxen - da musst du dann auch immer direkt nach der aktualisierung reagieren


Anmelden zum Antworten