Модификация данных объекта зависимостей записи WPF C # - PullRequest
0 голосов
/ 11 февраля 2011

Я здесь работаю с объектами зависимостей, раньше с ними ничего не делал, но они выглядят очень полезными.

По сути, я использовал эти объекты для редактирования в ListView. Однако затем я должен записать эти изменения обратно в SQL. У меня вопрос, есть ли способ записать, были ли данные изменены, потому что я не хочу писать обратно в SQL каждый раз, когда кто-то просматривает данные. В настоящее время у меня есть это:

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); }
    }
}

Моя идея состояла в том, чтобы иметь что-то вроде:

    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; }
    }

Таким образом, каждый раз, когда что-то редактируется, свойство DataModified будет иметь значение TRUE, это хороший способ сделать это? Или у кого-то есть намного лучший способ сделать это?

Заранее спасибо.

SumGuy.

Ответы [ 2 ]

4 голосов
/ 11 февраля 2011

Это на самом деле не будет работать, если вы привязываетесь к свойству зависимости. Механизм привязки WPF на самом деле не использует ваше свойство CLR "Department", а напрямую использует "SetValue" для свойства зависимостей. Это простое решение.

UIPropertyMetadata имеет поле для PropertyChangedCallback, которое будет запускаться каждый раз при изменении значения свойства (либо непосредственно из вызова SetValue, либо через свойство CLR, которое оборачивает вызов SetValue)

Вот пример:

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); }
}

DependencyObject (d) - это объект, которому принадлежит свойство. В вашем случае это будет экземпляр KPI.

Для справки, вот ссылка на документацию MSDN UIPropertyMetadata: http://msdn.microsoft.com/en-us/library/system.windows.uipropertymetadata.aspx

1 голос
/ 11 февраля 2011

Система привязки WPF не обязательно вызывает свойство Department CLR, вместо этого она напрямую вызывает SetValue всякий раз, когда обновляет свойство зависимости (в данном случае Department). Это означает, что ваша оболочка CLR может не вызываться, что в свою очередь означает, что любой код, написанный в блоке set (свойства Department CLR), не будет выполнен.

Но не волнуйтесь, для этого есть решение. При инициализации DepartmentProperty вы можете передать обратный вызов UIPropertyMetadata, который будет вызываться каждый раз, когда обновляется свойство зависимости. Все это означает, что вы должны реализовать это:

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!
}
...