Я создал ControlTemplate
для своего пользовательского элемента управления MyControl
.
MyControl
происходит от System.Windows.Controls.Control
и определяет следующее свойство public ObservableCollection<MyControl> Children{ get; protected set; }
.
Для отображения вложенных дочерних элементов управления я использую ItemsControl
(StackPanel
), который окружен GroupBox
. Если нет дочерних элементов управления, я хочу скрыть GroupBox
.
Все отлично работает при запуске приложения: групповой блок и дочерние элементы управления отображаются, если свойство Children изначально содержало хотя бы один элемент. В другом случае он скрыт.
Проблема начинается, когда пользователь добавляет дочерний элемент управления в пустую коллекцию. Видимость GroupBox
все еще ухудшена. Та же проблема возникает, когда последний дочерний элемент управления удаляется из коллекции. GroupBox
все еще виден.
Другим симптомом является то, что преобразователь HideEmptyEnumerationConverter
не вызывается.
Добавление / удаление дочерних элементов управления в непустые коллекции работает как ожидалось.
Что не так со следующей привязкой? Очевидно, он работает один раз, но не обновляется, хотя коллекция, к которой я привязываю, имеет тип 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
}
Другой, более общий вопрос: как вы отлаживаете привязки? Нашел это (http://bea.stollnitz.com/blog/?p=52) но все же мне очень трудно это сделать.
Я рад любой помощи или предложению.