Mam kontrolę, która dziedziczy po (odgadłeś) kontroli. Chcę otrzymywać powiadomienia o każdej zmianie właściwości FontSize
lub Style
. W WPF zrobiłbym to pod numerem DependencyProperty.OverrideMetadata()
. Oczywiście, takie przydatne rzeczy nie mają miejsca w Silverlight. Jak więc otrzymać takie powiadomienia?Silverlight: Jak otrzymać powiadomienie o zmianie w dziedziczonej zależności DependencyProperty
Odpowiedz
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.
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);
}
Jestem prawie pewny, że DependencyPropertyDescrtiptors są mitycznymi bestiami w Silverlight, niestety. – MojoFilter
DependencyPropertyDescriptor nie jest obsługiwany przez Silverlight 2 lub 3 – markti
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.
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.
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.
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? –
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
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
. 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. –