Bon c'est la journée des embetements avec WPF.

j'ai cette classe avec une dependencyProperty :

Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
/// <summary>
    /// Logique d'interaction pour StorageDetail.xaml
    /// </summary>
    public partial class StorageDetail : UserControl
    {
 
        public static DependencyProperty StorageProperty = DependencyProperty.Register("Storage", typeof(Storage), typeof(StorageDetail),
            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(OnStorageChanged)));
 
        public static readonly RoutedEvent StorageChangedEvent = EventManager.RegisterRoutedEvent(
                "StorageChanged", RoutingStrategy.Bubble,
                 typeof(RoutedPropertyChangedEventHandler<Storage>), typeof(StorageDetail)); 
 
        private ObjectDataProvider storage;
        private ObjectDataProvider isReadOnly;
 
        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        public StorageDetail()
        {
            InitializeComponent();
 
            storage = this.FindResource("storage") as ObjectDataProvider;
            isReadOnly = this.FindResource("readOnly") as ObjectDataProvider;
            isReadOnly.ObjectInstance = false;
        }
 
        /// <summary>
        /// Evènement déclenché lors de la modification du lieu de stockage affiché
        /// </summary>
        public event RoutedPropertyChangedEventHandler<StorageDetail> StorageChanged
        {
            add { AddHandler(StorageChangedEvent, value); }
            remove { RemoveHandler(StorageChangedEvent, value); }
        } 
 
        /// <summary>
        /// Obtient ou défini le lieu de stockage affiché
        /// </summary>
        public Storage Storage
        {
            get
            {
                return (Storage)GetValue(StorageProperty);
            }
 
            set
            {
                SetValue(StorageProperty, value);
            }
        }
 
        /// <summary>
        /// Obtient ou défini si le controle est en lecture seul ou non
        /// </summary>
        public bool IsReadOnly
        {
            get
            {
                return (bool)this.isReadOnly.ObjectInstance;
            }
 
            set
            {
                this.isReadOnly.ObjectInstance = value;
            }
        }
 
        private static void OnStorageChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
        {
            if (!(sender != null && sender is StorageDetail))
                return;
 
            StorageDetail sd = sender as StorageDetail;
            sd.storage.ObjectInstance = (Storage)args.NewValue;
 
        }
 
        private void OnStorageChanged(RoutedPropertyChangedEventArgs<Storage> e)
        {
            RaiseEvent(e);
        } 
 
    }

le type de donnée Storage implémente bien INotifyPropertyChanged

Le problème : Lors de la fermeture de l'application (par fermeture de la fenetre principale ) un thread ( Marqué Thread principal dans VS ) reste ouvert. Impossible de savoir dans quel code il tourne ...

Je sais que le pb vient de la car :
- Avant de mettre cette dependencyProperty ça fonctionnais nickel.
- Si elle est pas utilisé (Donc si je bind pas de donnée dessus ) ça fonctionne aussi

Bref j'en ai marre WPF s'acharne sur moi