【发布时间】:2010-06-15 14:45:23
【问题描述】:
我为我的自定义控件MyControl 创建了一个ControlTemplate。
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),但我仍然觉得很难做到。
很高兴有任何帮助或建议。
【问题讨论】:
标签: wpf binding observablecollection controltemplate relativesource