WinRT Custom Control Dependen Property Setting/Binding
custom-controls dependency-properties (1)
Estoy intentando desarrollar un control personalizado para una aplicación WinRT / Metro.
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?
Parece una cosa simple de hacer y, ¡honestamente! - He intentado encontrar una solución aquí y en otros lugares. Cualquier ayuda sería muy apreciada.
Puede establecer el valor predeterminado en PropertyMetadata (¡los fragmentos 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, puede hacerlo, pero si utiliza un enlace básico que es OneWay
, es decir, toma el valor de un origen de enlace y lo establece en la propiedad de dependencia, el enlace dejará de funcionar porque los valores de origen y destino no se sincronizará más.
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.