绑定到UserControl元素的ListBox?

时间:2012-04-05 05:08:53

标签: silverlight xaml silverlight-toolkit

这对我来说不合适:

<StackPanel>
    <ListBox x:Name="MyListBox"
        ItemsSource="{StaticResource UserControlsCollection}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
    </ListBox>
    <UserControl
        Content="{Binding ElementName=MyListBox, Path=SelectedValue}"
        />
</StackPanel>

我在运行时得到此“项目不在预期范围内”错误。这些是数据:

<toolkit:ObjectCollection x:Key="UserControlsCollection">
    <UserControl Style="{StaticResource UserControlListItemStyle}">
        <Button>One Button</Button>
    </UserControl>
    <UserControl Style="{StaticResource UserControlListItemStyle}">
        <ComboBox>
            <ComboBoxItem Content="One" IsSelected="True" />
            <ComboBoxItem Content="Two" />
            <ComboBoxItem Content="Three" />
        </ComboBox>
    </UserControl>
    <UserControl Style="{StaticResource UserControlListItemStyle}">
        <Rectangle
            Fill="Red"
            Width="120" Height="120"
            />
    </UserControl>
</toolkit:ObjectCollection>

1 个答案:

答案 0 :(得分:0)

您尝试显示相同的FrameworkElements(集合中的那些)两次:一次作为ListBox中的项目,并在绑定的UserControl中第二次选择后。

所有FrameworkElements只能挂在可视树中一次(即它们触发加载的事件时)。

要实现您的目标,您需要分离模型和视图。模型将在您的集合中,可以是任何类型,通常实现INotifyPropertyChanged或派生自DependencyObject,您的视图可以是DataTemplates作为资源,Target属性是模型的类型。

从SL5开始,任何以模型为内容的ContentControl(同样ListBox,模型作为绑定集合的元素)将自动获取那些DataTemplates(如果它们在范围内)。然后,每个模型可能会多次实例化模板。