2009-05-07 9 views

Odpowiedz

15

Myślę, że tutaj jest lepszy sposób. Nadal trzeba zobaczyć zalety i wady.

/// 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); 
    } 

Teraz można wywołać RegisterForNotification w celu zarejestrowania powiadomienia o zmianach właściwości elementu, na przykład.

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

Patrz mój post tutaj na tej samej http://amazedsaint.blogspot.com/2009/12/silverlight-listening-to-dependency.html

Korzystanie Silverlight 4.0 beta.

+0

Podoba mi się, że jest to ładniejszy sposób na owijanie tego paskudnego powiązania, ale jest to bardzo ciężki sposób na otrzymanie powiadomień o zmianie właściwości. – MojoFilter

+1

Tak długo, jak musimy to zrobić w całości z kodu, myślę, że nie mamy innej opcji, dopóki nie otrzymamy DependencyPropertyDescriptor z Silverlight z MS – amazedsaint

+0

. Użyłem też tego podejścia, niestety wycieka to z pamięci. Z mojego doświadczenia wynika, że ​​będzie on zawierał odniesienie do elementu, z którego go użyjesz, a który z kolei będzie się trzymał innych obiektów.Winowajcą wydaje się być callback, który zachowuje odniesienie do twojego widoku na całe życie twojego wniosku. –

-2

To co ja zawsze używać (nie testowałem go na SL choć tylko na 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

Jestem prawie pewny, że DependencyPropertyDescrtiptors są mitycznymi bestiami w Silverlight, niestety. – MojoFilter

+2

DependencyPropertyDescriptor nie jest obsługiwany przez Silverlight 2 lub 3 – markti

0

Nie można zewnętrznie słuchać Zależność własności zmieniło powiadomień.

można uzyskać dostęp zależność właściwości metadanych z następującej linii kodu:

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

Jednak jedynym członkiem publiczny, który jest narażony jest „DefaultValue”.

Istnieje wiele sposobów, aby to zrobić w WPF. Ale obecnie nie są obsługiwane przez Silverlight 2 lub 3.

0

Jedyne rozwiązanie, jakie widzę, to wysłuchanie zdarzenia LayoutUpdated - tak, wiem, że to się nazywa dużo. Należy jednak pamiętać, że w niektórych przypadkach nie zostanie wywołany, mimo że zmieniono rozmiar lub styl czcionki.

6

To raczej odrażający hack, ale można użyć dwukierunkowego wiązania do symulacji tego.

to znaczy mieć coś takiego:

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); 
    } 
} 

następnie utworzyć wiązanie jak:

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

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

następnie podłączyć do wydarzenia słuchacza w swojej podklasy sterowania.

+0

Po zmianie właściwości właściwości FontSize MyControlSubclass, powiązanie będzie jasne, więc wydaje się, że nie działa? nie? –