J'ai créé un ControlTemplate
pour mon contrôle personnalisé MyControl
.WPF: Liaison à ObservableCollection dans ControlTemplate n'est pas mis à jour
MyControl
dérive de System.Windows.Controls.Control
et définit la propriété suivante public ObservableCollection<MyControl> Children{ get; protected set; }
.
Pour afficher les contrôles enfants imbriqués j'utilise un ItemsControl
(StackPanel
) qui est entouré par un GroupBox
. S'il n'y a aucun contrôle enfant, je veux masquer le GroupBox
.
Tout fonctionne correctement au démarrage de l'application: La zone de groupe et les contrôles enfants sont affichés si la propriété Children contenait initialement au moins un élément. Dans l'autre cas, il est caché.
Le problème commence lorsque l'utilisateur ajoute un contrôle enfant à une collection vide. La visibilité de GroupBox
est toujours réduite. Le même problème se produit lorsque le dernier contrôle enfant est supprimé de la collection. Le GroupBox
est toujours visible. Un autre symptôme est que le convertisseur HideEmptyEnumerationConverter
n'est pas appelé. Ajouter/supprimer des contrôles enfants à des collections non vides fonctionne comme prévu.
Quel est le problème avec la liaison suivante? Évidemment, cela fonctionne une fois mais n'est pas mis à jour, bien que la collection à laquelle je suis lié soit de type ObservableCollection
.
<!-- Converter for hiding empty enumerations -->
<Common:HideEmptyEnumerationConverter x:Key="hideEmptyEnumerationConverter"/>
<!--- ... --->
<ControlTemplate TargetType="{x:Type MyControl}">
<!-- ... other stuff that works ... -->
<!-- Child components -->
<GroupBox Header="Children"
Visibility="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Children, Converter={StaticResource hideEmptyEnumerationConverter}}">
<ItemsControl ItemsSource="{TemplateBinding Children}"/>
</GroupBox>
</ControlTemplate>
.
[ValueConversion(typeof (IEnumerable), typeof (Visibility))]
public class HideEmptyEnumerationConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int itemCount = ((IEnumerable) value).Cast<object>().Count();
return itemCount == 0 ? Visibility.Collapsed : Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Une autre question plus générale: Comment les gars déboguez-vous les liaisons? J'ai trouvé ça (http://bea.stollnitz.com/blog/?p=52) mais je trouve que c'est très difficile à faire.
Je suis content pour toute aide ou suggestion.
Merci beaucoup! –