Вопрос

Я немного озадачен созданием 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");
}

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

Это было полезно?

Решение

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

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

<Ч>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top