2010-11-05 25 views
14

A veces pienso que quizás use las Propiedades de dependencia innecesariamente. ¿Cuándo debo usarlo? Cuando tengo una propiedad que depende de otras propiedades? Supongamos que tengo una propiedad Color que quiero que dependa de las propiedades Hue, Saturation, Luminosity ¿uso una propiedad de dependencia? ¿O qué uso? Controlo que está obligado a Color para actualizar cuando se cambian las propiedades Hue, Saturation, Luminosity.Cuándo utilizar las Propiedades de dependencia

por ahora lo que hice fue

public byte Hue { 
    get { return _hue; } 
    set 
    { 
     if (_hue == value) 
      return; 
     _hue = value; 
     NotifyPropertyChanged("Hue"); 
     NotifyPropertyChanged("Color"); // to update controls bound to color 
    } 
} 

pero creo que esto no es la forma correcta de hacer las cosas? Si tengo más propiedades que afectan el color, tendré 1 línea adicional en todas esas propiedades?

+1

No creo que sea una sobrecarga irrazonable en términos de código, y es ciertamente más liviano que agregar una DependencyProperty. –

+0

si va a la ruta hsl-color. Lo haría, así que lo hago 't necesidad de calc tan a menudo. Por ejemplo, la tienda de H, S y L, en todo momento, y convertir sólo cuando necesitan sincronizarse. Esto mejorará enormemente su velocidad. –

Respuesta

21

Solo debe usar un DependencyProperty cuando desee vincular su valor a algo a través de XAML, p. Ej.

<local:MyObject MyDependencyProperty="{Binding ...}" /> 

Actualización: como se ha mencionado por Ian continuación, las propiedades de dependencia también son necesarios si usted quiere ser capaz de animar su propiedad o se establece a través de un estilo

Si no es necesario trabajar de esta manera entonces es innecesario. p.ej. Si lo que desea es ser capaz de establecer el valor de una constante a través de XAML (como abajo) esto va a funcionar sin utilizar un DependencyProperty

<local:MyObject MyRegularProperty="Some Value" /> 

mismo modo, si desea enlazar a el valor de una propiedad en (por ejemplo) su vista del modelo:

<TextBlock Text="{Binding MyViewModelProperty}" /> 

entonces usted no necesita utilizar un DependencyProperty. Siempre que implemente INotifyPropertyChanged, el Text se actualizará cuando cambie la propiedad.

Editar: al releer su pregunta, no estoy seguro de si es o no su situación se verá afectada por el hecho de que use o no un DependencyProperty - si estoy leyendo correctamente, lo único que quiere hacer es causa que se actualicen varias propiedades en la interfaz de usuario cuando cualquiera de esas propiedades cambia, ¿verdad?

No creo que haya nada de malo en cómo está implementando las cosas en este momento (es decir, levantando un montón de eventos PropertyChanged en cada setter), pero si no está interesado en eso, entonces podría intentar tener una única propiedad que expone propiedades secundarias relevantes para unirse al que están todos calculado:

class ColorWrapper 
{ 
    public Color Color { get; set; } 
    public byte Hue 
    { 
     get { return this.Color.Hue; } //or however this is calculated 
} 

Entonces tienen una propiedad Color en su modelo de vista que genera el evento PropertyChanged y se unen a los que a través de la Vista:

<TextBlock Text="{Binding Color.Hue}" /> 

Como dije, no diría que esto es particularmente una mejora de lo que ya has pensado.

+0

la unión no es el de caso de uso Si el objeto de la aplicación de la propiedad es un elemento de interfaz de usuario (y algunas personas implementar AD en objetos no UI) del sistema DP permite varias otras características, incluyendo la animación, estilo y (WPF única - Silverlight no tiene estos) desencadena. Además, los DP son útiles si la propiedad a menudo se deja en su valor predeterminado, ya que cada instancia solo usa espacio para los DP que se han establecido. –

+0

@Ian Griffiths, buen punto en la animación y el estilo - respuesta actualizada. Su comentario sobre valores por defecto es válida supongo, pero dada la sobrecarga generada en la aplicación y el uso de una propiedad de dependencia a través de una planicie propiedad (sobre todo si no está ya trabajando en un 'DependencyObject') No me generalmente seguir ese camino. –

+4

El valor predeterminado tiene un impacto no trivial en el rendimiento de WPF. Ahorra unos pocos cientos de bytes por objeto, y si su árbol visual contiene unos pocos miles de objetos, eso equivale a varios cientos de KB. Una pequeña fracción de la memoria total, pero suficiente para un impacto masivo en el uso eficiente de la memoria caché de la CPU (especialmente durante el diseño). Sin embargo, es probable que sea irrelevante para cualquier objeto que no sea UI, y probablemente no sea de gran ayuda para los elementos de IU personalizados, donde hay una gran posibilidad de que establezca las propiedades de la cusom que defina. Así que estoy de acuerdo ... Solo quería ilustrar que los DP cumplen varios propósitos. –

15

Las reglas generales son:

  • Para los controles XAML, propiedades de uso de dependencia;

  • Para los datos (que se enlaza a la interfaz), utilice INotifyPropertyChanged.

Existen excepciones, pero son raras.

0

Recuerde que las propiedades de dependencia, aunque permiten el enlace como fuente o como destino, también son sensibles a subprocesos, y al serializar tendrá que usar un sustituto, la serialización ya que DependencyObject no es serializable.

Ah, y GetHashCode iguales y están sellados :(

2

Otro uso de las propiedades de dependencia es con el diario de navegación. Propiedades de dependencia personalizadas dentro de una página con la bandera Juornal en los meta-datos se incluyen en el estado que guarda WPF para la página.

Cuestiones relacionadas