我创建了一个ControlTemplate
为我的自定义控件MyControl
。
MyControl
从派生System.Windows.Controls.Control
和定义了以下属性public ObservableCollection<MyControl> Children{ get; protected set; }
public ObservableCollection<MyControl> Children{ get; protected set; }
public ObservableCollection<MyControl> Children{ get; protected set; }
。
要显示我使用的嵌套子控件ItemsControl
( StackPanel
其由包围) GroupBox
。 如果没有子控件,我想隐藏的GroupBox
。
一切正常,在应用程序启动罚款:该组框和子控件显示,如果儿童属性最初包含至少一个元素。 在其他情况下,它是隐藏的。
当用户添加一个子控件为空集的问题开始。 该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 ),但我仍然觉得很难做到。
我很高兴的任何帮助或建议。