5

Estoy tratando de desarrollar un control personalizado para una aplicación WinRT/Metro.WinRT Custom Control Dependency Propiedad Configuración/Enlace

Tiene una propiedad de dependencia y me gustaría poder establecer su valor dentro del control personalizado. Sin embargo, el uso de SetValue rompe cualquier vinculación que los consumidores del control puedan haber creado.

Ninguna de las soluciones que he encontrado (por ejemplo, SetCurrentValue) parece aplicarse a WinRT/Metro. ¿Hay una solución para esto?

Suena como algo simple de hacer y, ¡para ser sincero! - He intentado encontrar una solución aquí y en otros lugares. Cualquier ayuda sería muy apreciada.

Respuesta

2

Puede establecer el valor predeterminado en PropertyMetadata (snippets del Dr. WPF al rescate).

#region IsAvailable 
private static bool DefaultIsAvailable = false; 

/// <summary> 
/// IsAvailable Dependency Property 
/// </summary> 
public static readonly DependencyProperty IsAvailableProperty = 
    DependencyProperty.Register(
     "IsAvailable", 
     typeof(bool), 
     typeof(CustomControl1), 
     new PropertyMetadata(DefaultIsAvailable, OnIsAvailableChanged)); 

/// <summary> 
/// Gets or sets the IsAvailable property. This dependency property 
/// indicates .... 
/// </summary> 
public bool IsAvailable 
{ 
    get { return (bool)GetValue(IsAvailableProperty); } 
    set { SetValue(IsAvailableProperty, value); } 
} 

/// <summary> 
/// Handles changes to the IsAvailable property. 
/// </summary> 
/// <param name="d"> 
/// The <see cref="DependencyObject"/> on which 
/// the property has changed value. 
/// </param> 
/// <param name="e"> 
/// Event data that is issued by any event that 
/// tracks changes to the effective value of this property. 
/// </param> 
private static void OnIsAvailableChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var target = (CustomControl1)d; 
    bool oldIsAvailable = (bool)e.OldValue; 
    bool newIsAvailable = target.IsAvailable; 
    target.OnIsAvailableChanged(oldIsAvailable, newIsAvailable); 
} 

/// <summary> 
/// Provides derived classes an opportunity to handle changes 
/// to the IsAvailable property. 
/// </summary> 
/// <param name="oldIsAvailable">The old IsAvailable value</param> 
/// <param name="newIsAvailable">The new IsAvailable value</param> 
protected virtual void OnIsAvailableChanged(
    bool oldIsAvailable, bool newIsAvailable) 
{ 
} 
#endregion 

EDITAR *

Si desea cambiar el valor - se puede, pero si se utiliza una unión básica que es OneWay - es decir - que toma el valor de una fuente vinculante y lo establece en el propiedad de dependencia: el enlace dejará de funcionar porque los valores de origen y destino ya no se sincronizarán.

Si configura Mode="TwoWay" - la fuente de enlace se actualizará cuando el destino de enlace (su control) modifique la propiedad de dependencia, por lo que el enlace seguirá siendo válido y continuará funcionando en ambos sentidos.

+0

Su respuesta indica que al establecer el valor se rompe el enlace, que fue la razón por la que formulé la pregunta. La única alternativa que puedo pensar es implementar INotifyPropertyChanged y usar una propiedad "regular", pero los usuarios no pueden vincularse a ella. –

+0

Hmmm, de hecho, me confundí. El enlace no se romperá si configura el modo en TwoWay. –

+1

Según http://msdn.microsoft.com/en-us/library/windows/apps/hh700353 Las vinculaciones se tratan como un valor local a los efectos de la prioridad de valor de propiedad de dependencia, lo que significa que si establece otro valor local a una propiedad que originalmente tenía un valor de Enlace, eliminará el enlace. Este es el comportamiento que parece experimentar –

Cuestiones relacionadas