DependencyProperties, где значение не хранится локально - PullRequest
0 голосов
/ 19 июня 2009

Я немного запутался в создании DependencyProperty для свойств, которые зависят от внешних источников. Например, в ультразвуковом приложении, которое я пишу, в настоящее время у меня есть следующее в оболочке Managed C ++ (здесь для простоты переведен на C #, реализующий INotifyPropertyChanged):

public int Gain
{
    get { return ultrasound.GetParam(prmGain); }
    set 
    { 
        ultrasound.SetParam(prmGain, value);
        NotifyPropertyChanged("Gain");
    }
}

Весь мой код используется в WPF, и я размышлял, как произойдет изменение INotifyPropertyChanged на DependencyProperty и получу ли я пользу от этих изменений. Существует около 30 переменных, похожих на эту, большинство из которых привязаны к экранному слайдеру, текстовому блоку или другому элементу управления.

Правильно ли следующее для реализации DependencyProperty для этого объекта?

public int Gain
{
    get { return ultrasound.GetParam(prmGain); }
    set 
    { 
        ultrasound.SetParam(prmGain, value);
        this.SetValue(GainProperty, value); 
    }
}

public static readonly DependencyProperty GainProperty = DependencyProperty.Register(
    "Gain", typeof(int), typeof(MyUltrasoundWrapper), new PropertyMetadata(0));

Я никогда не видел пример, где this.GetValue(GainProperty) не использовался. Также есть другие функции, которые могут изменять значение. Это тоже будет правильным изменением?

public void LoadSettingsFile(string fileName)
{
    // Load settings...

    // Gain will have changed after new settings are loaded.
    this.SetValue(GainProperty, this.Gain);
    // Used to be NotifyPropertyChanged("Gain");
}

Кроме того, стоит отметить, что следует ожидать повышения производительности в случаях, когда большинство свойств связаны с данными, или, скорее, потери производительности в случаях, когда многие параметры НЕ связаны с данными?

1 Ответ

2 голосов
/ 19 июня 2009

При использовании свойства зависимостей методы Get и Set должны быть просто обертками для this.GetValue () и this.SetValue (), причина этого в том, что WPF не использует методы получения или установки для доступа к значению, поэтому Вы не можете зависеть от дополнительного кода, работающего все время.

Если вам нужно, чтобы эти свойства были свойствами зависимостей, создайте стандартное свойство зависимостей, которое эффективно кэширует ваш результат ультразвука. GetParam (prmGain) и вызывает ультразвук. независимо от того, как изменилось свойство.


Хотя то, что я написал выше, все еще верно, перечитывание вашего вопроса заставляет меня думать, что вы, возможно, неправильно понимаете, что такое свойство зависимости. Если этот объект-обертка C ++ фактически является вашей моделью, то вы хотите остаться с INotifyPropertyChanged. Свойства зависимостей предназначены для внутреннего использования элементом управления WPF, чтобы упростить связывание и уменьшить объем занимаемой памяти. Они не должны использоваться внутри поставщика данных, для этого предназначены интерфейсы уведомлений.

...