« Dependency property » : différence entre les versions

De Banane Atomic
Aller à la navigationAller à la recherche
 
Ligne 28 : Ligne 28 :
= Code =
= Code =
<kode lang=cs>
<kode lang=cs>
public string Text
{
    get => (string)GetValue(TextProperty);
    set => SetValue(TextProperty, value);
}
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
     "Text",           // le nom de la propriété
     nameof(Text),     // le nom de la propriété
     typeof(string),   // le type de la propriété
     typeof(string),   // le type de la propriété
     typeof(MaClasse), // le type de la classe contenant la DependencyProperty
     typeof(MyControl), // le type de la classe contenant la DependencyProperty
     // la PropertyMetadata
     // la PropertyMetadata
     new FrameworkPropertyMetadata(
     new FrameworkPropertyMetadata(
         String.Empty,                                          // la valeur par défaut
         String.Empty,                                          // la valeur par défaut
         FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, // options
         FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, // options
         OnTextChanged));                               // change handler, appelé à chaque changement de valeur de la propriété
         MyControl.OnTextChanged));                             // change handler, appelé à chaque changement de valeur de la propriété


public string Text
private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
{
     get { return (string)GetValue(TextProperty); }
     var myControl = (MyControl)d;
     set { SetValue(TextProperty, value); }
    var oldValue = (string)e.OldValue;
}
     var newValue = (string)e.NewValue;


private static void OnTextChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
     myControl.OnTextChanged(oldValue, newValue);
{
     var monObjet = (MaClasse)o;
    monObjet.OnTextChanged((string)e.OldValue, (string)e.NewValue);
}
}


private void OnTextChanged(string oldValue, string newValue)
protected virtual OnTextChanged(string oldValue, string newValue)
{
{
     ...
     ...

Version du 17 avril 2020 à 21:05

Définition

Etend une propriété pour qu'elle puisse être définie avec:

  • un data binding
  • un style
  • un trigger
  • un behavior
  • un visual state
  • une animation

Toutes les propriétés des control WPF sont des dependency properties.

snippet propdp

Csharp.svg
public int MyProperty
{
    get { return (int)GetValue(MyPropertyProperty); }
    set { SetValue(MyPropertyProperty, value); }
}

public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.Register(
        "MyProperty", 
        typeof(int), 
        typeof(ownerclass), 
        new PropertyMetadata(0));  // default value

Code

Cs.svg
public string Text
{
    get => (string)GetValue(TextProperty);
    set => SetValue(TextProperty, value);
}

public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
    nameof(Text),      // le nom de la propriété
    typeof(string),    // le type de la propriété
    typeof(MyControl), // le type de la classe contenant la DependencyProperty
    // la PropertyMetadata
    new FrameworkPropertyMetadata(
        String.Empty,                                          // la valeur par défaut
        FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, // options
        MyControl.OnTextChanged));                             // change handler, appelé à chaque changement de valeur de la propriété

private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var myControl = (MyControl)d;
    var oldValue = (string)e.OldValue;
    var newValue = (string)e.NewValue;

    myControl.OnTextChanged(oldValue, newValue);
}

protected virtual OnTextChanged(string oldValue, string newValue)
{
    ...
}

PropertyMetadata, UIPropertyMetadata, FrameworkPropertyMetadata

Il y a une relation d'héritage entre ces 3 classes : PropertyMetadata ← UIPropertyMetadata ← FrameworkPropertyMetadata

  • PropertyMetadata : base
  • UIPropertyMetadata : permet de définir bool isAnimationProhibited
  • FrameworkPropertyMetadata : permet de définir des FrameworkPropertyMetadataOptions et un UpdateSourceTrigger

Ajout d'une DependencyProperty BindableSource sur le WebBrowser

Csharp.svg
namespace Mon.Namespace
{
    public static class WebBrowserUtility
    {
        public static readonly DependencyProperty BindableSourceProperty =
            DependencyProperty.RegisterAttached("BindableSource", 
                                                typeof(string), 
                                                typeof(WebBrowserUtility), 
                                                new UIPropertyMetadata(null, BindableSourcePropertyChanged));

        public static string GetBindableSource(DependencyObject obj)
        {
            return (string)obj.GetValue(BindableSourceProperty);
        }

        public static void SetBindableSource(DependencyObject obj, string value)
        {
            obj.SetValue(BindableSourceProperty, value);
        }

        public static void BindableSourcePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            WebBrowser browser = o as WebBrowser;
            if (browser != null)
            {
                string uri = e.NewValue as string;
                browser.Source = !String.IsNullOrEmpty(uri) ? new Uri(uri) : null;
            }
        }
    }
Xaml.svg
<Window xmlns:ns="clr-namespace:Mon.Namespace"
    <WebBrowser ns:WebBrowserUtility.BindableSource="{Binding Path=MaPropriété}"/>