从ItemsControl派生的WPF自定义控件无法显示绑定数据

时间:2011-03-10 03:03:06

标签: wpf wpf-controls binding

我创建了一个名为MovableItemsControl的自定义控件,继承自ItemsControl,以覆盖 GetContainerForItemOverride()方法。我的问题是绑定集合中没有任何对象正在显示。目前,我绑定了一个OberservableCollection字符串,当我查看调试器时,我可以看到它们在 ItemsSource 中。

自定义控件如下所示:

public class MovableItemsControl : ItemsControl
{
    static MovableItemsControl()
    {          
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MovableItemsControl), new FrameworkPropertyMetadata(typeof(MovableItemsControl)));
    }

    /// <summary>
    /// Wraps each content object added to the ItemsControl in a NodeWrapper
    /// </summary>
    protected override DependencyObject GetContainerForItemOverride()
    {
        NodeWrapper nodeWrapper = new NodeWrapper();            
        return nodeWrapper;
    }

    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return item is NodeWrapper;
    }
}

NodeWrapper是一个UserControl,由一个派生自Thumb(MoveThumb)和Label的自定义控件组成(Label仅用于测试)。

    <Style TargetType="{x:Type local:MovableItemsControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MovableItemsControl}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>   

2 个答案:

答案 0 :(得分:5)

您是否在包含控件的项目的Generic.xaml文件中使用ControlTemplate创建了MoveableItemsControl的默认样式?如果没有,控件在加载时无需呈现。

<强>更新
ItemsControl的ControlTemplate需要包含ItemsPresenter作为要注入的项的占位符(类似于ContentPresenter for ContentControl)。您当前的模板只有一个空的边框。

答案 1 :(得分:2)

我认为你在你的风格ControlTemplate Border中缺少:
a)ItemPresenter(例如<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>)或
b)IsItemsHost设置为真的面板(例如<StackPanel IsItemsHost="True"/>