5

Sto provando a sviluppare un controllo personalizzato per un'applicazione WinRT/Metro.WinRT Dipendente controllo personalizzato proprietà Setting/Binding

Ha una proprietà di dipendenza e vorrei poter impostare il suo valore all'interno del controllo personalizzato. Tuttavia, l'utilizzo di SetValue interrompe qualsiasi associazione che i consumer del controllo potrebbero aver creato.

Nessuna delle soluzioni che ho trovato (ad esempio SetCurrentValue) sembra applicarsi a WinRT/Metro. c'è una soluzione a questo?

Sembra una cosa semplice da fare e - onestamente! - Ho provato a trovare una soluzione qui e altrove. Qualsiasi aiuto sarebbe molto apprezzato.

risposta

2

È possibile impostare il valore predefinito in PropertyMetadata (Dr. WPF's snippets per il salvataggio!).

#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 

EDIT *

Se si desidera modificare il valore - è possibile, ma se si utilizza un legame di base che è OneWay - cioè - ci vuole il valore da una fonte vincolante e lo imposta al proprietà di dipendenza: l'associazione smetterà di funzionare perché i valori di origine e di destinazione non saranno più sincronizzati.

Se si imposta Mode="TwoWay" - l'origine di associazione verrà aggiornata quando la destinazione vincolante (il proprio controllo) modifica la proprietà di dipendenza, pertanto l'associazione rimarrà valida e continuerà a funzionare in entrambi i modi.

+0

La risposta indica che l'impostazione del valore interrompe l'associazione, motivo per cui ho posto la domanda. L'unica alternativa che posso pensare è implementare INotifyPropertyChanged e utilizzare una proprietà "regolare", ma gli utenti non possono associarvi. –

+0

Hmmm, in realtà - mi sono confuso. L'associazione non si interromperà se si imposta la Modalità su TwoWay. –

+1

In base a http://msdn.microsoft.com/en-us/library/windows/apps/hh700353 I binding vengono considerati come valore locale ai fini della precedenza del valore della proprietà di dipendenza, il che significa che se si imposta un altro valore locale a una proprietà che originariamente conteneva un valore di associazione, eliminerai la rilegatura. Questo è il comportamento che mi sembra di provare –