La problématique est la suivante : J’ai une DependencyProperty dans une application Silverlight et cette dernière n’a pas d’événement lorsque sa valeur change.
Or, il faut que dans mon application je sois notifié sinon ca ne marchera pas.
Quel cruel dilemne! D’autant plus qu’en WPF je n’aurai aucun mal à faire cela puisque je pourrai directement me brancher dessus en tant qu’owner ou bien encore récupérer ses métadatas et rajouter un événement.
Mais sous Windows Phone 7, point de tout cela. Heureusement il existe (au moins) une solution (je dis au moins, car au bureau on veut me faire croire qu’il existerait d’autres solutions mais plus élégantes. Comme pour le moment ils n’ont rien trouvé, je publie la mienne:))
Nous allons tout simplement faire un binding entre la propriété que je veux surveiller et une DependencyProperty que je vais créer et ou je pourrais sans problème indiquer un événement. Ainsi quand ma propriété d’origine va changer, le binding va automatiquement changer ma propriété de surveillance qui me lèvera gentiment un événement.
En code cela donne donc ceci:
using System;
using System.Windows;
using System.Windows.Data;
using Microsoft.Phone.Controls;
namespace WindowsPhoneApplication1
{
public class DependencyProperyWatcher<T> : DependencyObject
{
public event EventHandler ValueChanged;
public static readonly DependencyProperty property =
DependencyProperty.Register("Value", typeof(T),
typeof(DependencyProperyWatcher<T>), new PropertyMetadata(OnvalueChanged));
static void OnvalueChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
((DependencyProperyWatcher<T>) d).RaiseValueChanged();
}
public DependencyProperyWatcher(DependencyObject d, string propName)
{
var bnd = new Binding(propName)
{
Source = d,
Mode = BindingMode.OneWay
};
BindingOperations.SetBinding(this, property, bnd);
}
void RaiseValueChanged()
{
if (ValueChanged != null)
ValueChanged(this, EventArgs.Empty);
}
}
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
}
public void test()
{
DependencyProperyWatcher<double> toto =
new DependencyProperyWatcher<double>(this, "Width");
}
}
}
Via ma variable toto, je peux avoir accès à un événement qui sera levé à chaque fois que la propriété Width de ma page changera !
Windows Phone, Silverlight, .Net
Windows Phone 7, Bidouille