在Silverlight中使用ItemsSource之前,项集合必须为空

时间:2011-11-03 14:40:07

标签: silverlight xaml

内部自定义控件我正在尝试绑定我的ItemsControl.ItemsSource并获取错误。以下是模板的外观:

<Style TargetType="controls:IdattFilterBox">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="controls:IdattFilterBox">
                    <ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Auto">
                        <ItemsControl x:Name="PART_ItemsControl">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Grid HorizontalAlignment="Stretch">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="*" />
                                            <ColumnDefinition Width="*" />
                                            <ColumnDefinition Width="*" />
                                            <ColumnDefinition Width="*" />
                                        </Grid.ColumnDefinitions>
                                        <TextBlock Text="{Binding Caption}" />
                                        <ComboBox Grid.Column="1">
                                            <ComboBoxItem Content="Contains" />
                                            <ComboBoxItem Content="Begins with" />
                                            <ComboBoxItem Content="Ends with" />
                                        </ComboBox>
                                        <TextBox Grid.Column="2" Text="{Binding FieldFilter1, Mode=TwoWay}" />
                                        <TextBox Grid.Column="3" Text="{Binding FieldFilter2, Mode=TwoWay}" />
                                    </Grid>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                                                                                                                            <Border Grid.ColumnSpan="2" x:Name="ValidationErrorElement" BorderBrush="#FFDB000C" BorderThickness="1" CornerRadius="1" Visibility="Collapsed">
                            <ToolTipService.ToolTip>
                                <ToolTip x:Name="validationTooltip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Template="{StaticResource ValidationToolTipTemplate}">
                                    <ToolTip.Triggers>
                                        <EventTrigger RoutedEvent="Canvas.Loaded">
                                            <BeginStoryboard>
                                                <Storyboard>
                                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="validationTooltip">
                                                        <DiscreteObjectKeyFrame KeyTime="0">
                                                            <DiscreteObjectKeyFrame.Value>
                                                                <System:Boolean>true</System:Boolean>
                                                            </DiscreteObjectKeyFrame.Value>
                                                        </DiscreteObjectKeyFrame>
                                                    </ObjectAnimationUsingKeyFrames>
                                                </Storyboard>
                                            </BeginStoryboard>
                                        </EventTrigger>
                                    </ToolTip.Triggers>
                                </ToolTip>
                            </ToolTipService.ToolTip>
                            <Grid Background="Transparent" HorizontalAlignment="Right" Height="12" Margin="1,-4,-4,0" VerticalAlignment="Top" Width="12">
                                <Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z" Fill="#FFDC000C" Margin="1,3,0,0"/>
                                <Path Data="M 0,0 L2,0 L 8,6 L8,8" Fill="#ffffff" Margin="1,3,0,0"/>
                            </Grid>
                        </Border>
                        </ItemsControl>
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>    

在代码中我试图设置此PART的ItemSource:

this.WrapperItemsControl.ItemsSource = filterData;

在这一行,我收到错误(主题中的错误消息)。为什么我不能设置ItemsSource以及此错误的含义?我希望DataTemplate中的控件绑定到存储在filterData中的对象。

编辑:

PART_ItemsControl是我的WrapperItemsControl

this.WrapperItemsControl = GetTemplateChild(PartItemsControl) as ItemsControl;

EDIT2:

屏幕截图显示有一个项目(边框?)它来自哪里?! enter image description here

EDIT3

DOH!我将验证边框放在错误的位置

1 个答案:

答案 0 :(得分:14)

如果您手动将项目添加到ItemsControl,则无法使用ItemsSource。例如,如果您尝试这样做,则会收到错误:

<ItemsControl ItemsSource="{Binding MyItems}">
    <ListBoxItem>Item1</ListBoxItem>
    <ListBoxItem>Item2</ListBoxItem>
</ItemsControl>

你可能认为你没有这样做,但实际上你是。您正在向ItemsControl添加单个项目,该项目的类型为DataTemplate。看:

<ItemsControl ...>
    <DataTemplate ... />

该语法意味着“创建一个DataTemplate并将其添加到ItemsControl的Items属性”。 (Items是ItemsControl的默认属性,因此您在ItemsControl下嵌套的任何元素(如果未另行指定)都会添加到Items中。)

我认为您打算将DataTemplate分配给ItemsControl的ItemTemplate属性,而不是将其添加到Items。试试这个:

<ItemsControl ...>
    <ItemsControl.ItemTemplate>
        <DataTemplate ... />
    </ItemsControl.ItemTemplate>
</ItemsControl>