WPF:不更新ControlTemplate中的ObservableCollection绑定

Jul*_*ner 1 wpf binding relativesource observablecollection controltemplate

ControlTemplate为我的自定义控件创建了一个MyControl.

MyControl派生自System.Windows.Controls.Control并定义以下属性public ObservableCollection<MyControl> Children{ get; protected set; }.

要显示嵌套的子控件,我使用的是一个被a包围的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>
Run Code Online (Sandbox Code Playgroud)

.

[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
}
Run Code Online (Sandbox Code Playgroud)

另一个更普遍的问题:你们如何调试绑定?发现这个(http://bea.stollnitz.com/blog/?p=52),但我觉得很难做到.

我很高兴得到任何帮助或建议.

Abe*_*cht 6

问题是你的Children财产本身永远不会改变,只是它的内容.由于属性值不会更改,因此不会重新评估绑定.您需要做的是绑定到Count集合的属性.最简单的方法是使用DataTrigger模板中的a:

<ControlTemplate TargetType="{x:Type MyControl}">
  <!-- ... other stuff that works ... -->
  <!-- Child components -->
  <GroupBox x:Name="gb" Header="Children">
    <ItemsControl ItemsSource="{TemplateBinding Children}"/>
  </GroupBox>
  <ControlTemplate.Triggers>
      <DataTrigger Binding="{Binding Path=Children.Count, RelativeSource={RelativeSource TemplatedParent}}"
                   Value="0">
        <Setter TargetName="gb" Property="Visibility" Value="Collapsed" />
      </DataTrigger>
  </ControlTemplate.Triggers>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)