2011-02-11 3 views
0

Je travaille avec des objets de dépendance ici, pas beaucoup avec eux auparavant, mais ils semblent très utiles.WPF C# Enregistrement Modification de données d'objet de dépendance

Fondamentalement, j'ai utilisé ces objets pour être éditable dans un ListView. Cependant, je dois alors écrire ces changements en SQL. Ma question est, existe-t-il un moyen d'enregistrer si les données ont été modifiées parce que je ne veux pas écrire de nouveau à SQL chaque fois que quelqu'un voit les données. Actuellement, j'ai ceci:

public class KPI : DependencyObject 
{ 
    public static readonly DependencyProperty DepartmentProperty = DependencyProperty.Register("Department", typeof(string), typeof(KPI), new UIPropertyMetadata(null)); 

    public string Department 
    { 
     get { return (string)GetValue(DepartmentProperty); } 
     set { SetValue(DepartmentProperty, value); } 
    } 

    public static readonly DependencyProperty KPINumberProperty = DependencyProperty.Register("KPINumberProperty", typeof(int), typeof(KPI), new UIPropertyMetadata(null)); 

    public int KPINumber 
    { 
     get { return (int)GetValue(KPINumberProperty); } 
     set { SetValue(KPINumberProperty, value); } 
    } 
} 

Mon idée était d'avoir quelque chose comme:

public static bool DataModified = false; 

    public static readonly DependencyProperty DepartmentProperty = DependencyProperty.Register("Department", typeof(string), typeof(KPI), new UIPropertyMetadata(null)); 

    public string Department 
    { 
     get { return (string)GetValue(DepartmentProperty); } 
     set { SetValue(DepartmentProperty, value); DataModified = true; } 
    } 

Ainsi, chaque fois que quelque chose est édité la propriété DataModified sera réglé sur TRUE, est-ce une bonne façon de le faire ? Ou quelqu'un a-t-il une bien meilleure façon de le faire?

Merci d'avance.

SumGuy.

Répondre

1

système de fixation WPF ne nécessairement appel la propriété Department CLR, au lieu qu'il appelle directement SetValue chaque fois qu'il met à jour la dépendance des biens (dans ce cas Department). Cela signifie que votre wrapper CLR peut ne pas être appelé, ce qui signifie que le code que vous avez écrit dans le bloc set (de la propriété CLR Department) ne sera pas exécuté.

Mais ne vous inquiétez pas, il existe une solution pour cela. Lors de l'initialisation DepartmentProperty, vous pouvez passer un rappel à UIPropertyMetadata qui sera appelé chaque fois qu'il met à jour la propriété de dépendance. Tout ce que cela signifie est que vous devez implémenter ceci:

public static readonly DependencyProperty DepartmentProperty = DependencyProperty.Register 
    (
     "Department", 
     typeof(string), 
     typeof(KPI), 
     new UIPropertyMetadata(null, OnDepartmentChanged) 
    ); 

public string Department 
{ 
    get { return (string)GetValue(DepartmentProperty); } 
    set { SetValue(DepartmentProperty, value);} 
} 

static void OnDepartmentChanged(DependencyObject d, 
           DependencyPropertyChangedEventArgs e) 
{ 
    (d as KPI).DataModified = true; //this is all you want! 
} 
+0

Dans quel cas le moteur de liaison appelle la propriété Department CLR au lieu d'appeler directement SetValue? – Robin

+0

@Robin: C'est difficile à dire; dans certains cas, il peut appeler le wrapper CLR, dans certains cas il peut directement appeler les méthodes 'GetValue' et' SetValue'. De plus, les propriétés CLR rendent intellisense pour faire apparaître les noms dans le XAML. – Nawaz

+0

Je suis d'accord qu'il est préférable de faire les propriétés CLR, mais je n'ai jamais vu ou lu à peu près à tout moment où le moteur de liaison les utilise à la place de GetValue ou SetValue. Je vais vous croire sur parole. – Robin

4

Cela ne fonctionnera pas réellement si vous liez la propriété de dépendance. Le moteur de liaison WPF n'utilise pas réellement votre propriété "Department" CLR, mais utilise directement "SetValue" sur la propriété de dépendance. Il y a une solution facile à cela cependant.

Le UIPropertyMetadata a un champ pour une PropertyChangedCallback qui se déclenche chaque fois que la valeur de la propriété est modifiée (soit d'un appel à setValue directement, ou par la propriété CLR qui est enroulant l'appel AssignerValeur)

Voilà un exemple:

public static readonly DependencyProperty DepartmentProperty = 
    DependencyProperty.Register("Department", 
    typeof(string), 
    typeof(KPI), 
    new UIPropertyMetadata(null, DepartmentPropertyChanged)); 

private static void DepartmentPropertyChanged(DependencyObject d, 
    DependencyPropertyChangedEventArgs e) 
{ 
    KPI me = d as KPI; 
    if (me == null) return; 

    // Talk to your Business/Data layers here 
}  

public string Department 
{ 
    get { return (string)GetValue(DepartmentProperty); } 
    set { SetValue(DepartmentProperty, value); } 
} 

Le DependencyObject (d) est l'objet auquel la propriété appartient. Dans votre cas, ce serait une instance de KPI.

Pour référence, voici un lien vers la documentation UIPropertyMetadata MSDN: http://msdn.microsoft.com/en-us/library/system.windows.uipropertymetadata.aspx

Questions connexes