我创建了一个名为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>
答案 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"/>
)