2009-05-07 7 views

risposta

15

Penso che qui sia un modo migliore. Devo ancora vedere i pro e i contro.

/// Listen for change of the dependency property 
    public void RegisterForNotification(string propertyName, FrameworkElement element, PropertyChangedCallback callback) 
    { 

     //Bind to a depedency property 
     Binding b = new Binding(propertyName) { Source = element }; 
     var prop = System.Windows.DependencyProperty.RegisterAttached(
      "ListenAttached"+propertyName, 
      typeof(object), 
      typeof(UserControl), 
      new System.Windows.PropertyMetadata(callback)); 

     element.SetBinding(prop, b); 
    } 

E ora, è possibile chiamare RegisterForNotification per registrarsi per una notifica di modifica di una proprietà di un elemento, come.

RegisterForNotification("Text", this.txtMain,(d,e)=>MessageBox.Show("Text changed")); 
RegisterForNotification("Value", this.sliderMain, (d, e) => MessageBox.Show("Value changed")); 

Vedere il mio post qui sulla stessa http://amazedsaint.blogspot.com/2009/12/silverlight-listening-to-dependency.html

Usando Silverlight 4.0 beta.

+0

Mi piace il fatto che questo sia un modo più bello di avvolgere quella brutta legatura, ma questo è un modo terribilmente pesante per ottenere notifiche di modifica della proprietà. – MojoFilter

+1

Finché abbiamo bisogno di farlo interamente dal codice, suppongo che non abbiamo un'altra opzione finché non avremo il DependencyPropertyDescriptor in Silverlight da MS – amazedsaint

+0

Ho anche usato questo approccio, sfortunatamente perde memoria. Nella mia esperienza rimarrà un riferimento a qualsiasi elemento con cui lo si usi, che a sua volta rimarrà attaccato ad altri oggetti.Il colpevole sembra essere il callback che manterrà un riferimento al tuo punto di vista per la vita della tua applicazione. –

-2

Questo è quello che ho sempre utilizzare (non sono testati su SL, però, solo in WPF):

/// <summary> 
    /// This method registers a callback on a dependency object to be called 
    /// when the value of the DP changes. 
    /// </summary> 
    /// <param name="owner">The owning object.</param> 
    /// <param name="property">The DependencyProperty to watch.</param> 
    /// <param name="handler">The action to call out when the DP changes.</param> 
    public static void RegisterDepPropCallback(object owner, DependencyProperty property, EventHandler handler) 
    { 
     // FIXME: We could implement this as an extension, but let's not get 
     // too Ruby-like 
     var dpd = DependencyPropertyDescriptor.FromProperty(property, owner.GetType()); 
     dpd.AddValueChanged(owner, handler); 
    } 
+5

Sono sicuro che DependencyPropertyDescrtiptors sono animali mitici in Silverlight, sfortunatamente. – MojoFilter

+2

DependencyPropertyDescriptor non è supportato da Silverlight 2 o 3 – markti

0

Non è possibile ascoltare esternamente alla dipendenza proprietà cambiato notifiche.

È possibile accedere al Dependency Property metadati con la seguente riga di codice:

PropertyMetadata metaData = Control.ActualHeightProperty.GetMetadata(typeof(Control)); 

Tuttavia, l'unico membro del pubblico che è esposto è "DefaultValue".

Ci sono molti modi per farlo in WPF. Ma al momento non sono supportati da Silverlight 2 o 3.

0

L'unica soluzione che vedo è ascoltare l'evento LayoutUpdated - sì, so che è chiamato molto. Si noti tuttavia che in alcuni casi non verrà chiamato anche se FontSize o Style è cambiato.

6

È un trucco piuttosto disgustoso, ma è possibile utilizzare un binding a due vie per simulare questo.

vale a dire avere qualcosa di simile:

public class FontSizeListener { 
    public double FontSize { 
     get { return fontSize; } 
     set { fontSize = value; OnFontSizeChanged (this, EventArgs.Empty); } 
    } 

    public event EventHandler FontSizeChanged; 

    void OnFontSizeChanged (object sender, EventArgs e) { 
     if (FontSizeChanged != null) FontSizeChanged (sender, e); 
    } 
} 

quindi creare il legame simile:

<Canvas> 
    <Canvas.Resources> 
    <FontSizeListener x:Key="listener" /> 
    </Canvas.Resources> 

    <MyControlSubclass FontSize="{Binding Mode=TwoWay, Source={StaticResource listener}, Path=FontSize}" /> 
</Canvas> 

poi collegare al caso di chi ascolta nella sottoclasse di controllo.

+0

Quando la proprietà FontSize di MyControlSubclass cambia, l'associazione sarà chiara, quindi sembra che non funzioni? non? –

Problemi correlati