19

好的,这是一个看起来很简单的问题,但让我发疯。我正在学习 DataTemplating,并试图将一个非常简单的 ItemTemplate 应用于 ListBox。

但是,当我运行我的应用程序时,模板完全被忽略了,我只得到了标准外观的列表框,而实际上我希望看​​到一个带有“测试”的复选框列表。

我已经尝试了几次,结果总是一样。我在 Google 上检查了几个资源,并且在 ListBox 上定义和 ItemTemplate 的语法都相同,所以我真的看不出哪里出错了。

代码...

<Grid x:Name="LayoutRoot">
    <ListBox x:Name="TestList"
        SelectionMode="Multiple">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <CheckBox Content="Check this checkbox!"/>
                    <TextBlock>Test</TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.Items>
            <ListBoxItem>Bob</ListBoxItem>
            <ListBoxItem>Jim</ListBoxItem>
            <ListBoxItem>Dave</ListBoxItem>
            <ListBoxItem>Larry</ListBoxItem>
            <ListBoxItem>Tom</ListBoxItem>
        </ListBox.Items>            
    </ListBox>
</Grid>

非常感谢任何帮助。对不起,这个看似愚蠢的问题,但我真的在这里遇到了第一个障碍:(

4

3 回答 3

26

ItemTemplateListBoxItem当您直接作为项目放置时将不起作用。一般概念是您将 CRL 集合数据绑定到ListBox.ItemsSource,然后指定ItemTemplate. 检查下面的代码。

 <Grid x:Name="LayoutRoot">
        <ListBox x:Name="TestList"  SelectionMode="Multiple">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <CheckBox Content="Check this checkbox!"/>
                        <TextBlock Text="{Binding}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.Items>
                <sys:String>Bob</sys:String>
                <sys:String>Jim</sys:String>
                <sys:String>Dave</sys:String>
                <sys:String>Larry</sys:String>
                <sys:String>Tom</sys:String>
            </ListBox.Items>
        </ListBox>
    </Grid>

sys在哪里xmlns:sys="clr-namespace:System;assembly=mscorlib"

这样,ListBoxItems在后台生成了 5 个并添加到ListBox.

于 2010-03-16T17:34:10.703 回答
8

如果要将 ListBoxItems 直接添加到 ListBox,可以使用 ItemContainerStyle 而不是 ItemTemplate。

但是,仅当您需要每个项目级别的独特特征时才建议这样做。

如果您计划让所有项目看起来相同或使用 ItemsSource 制作动态列表,我建议您将字符串(或其他自定义对象)添加到列表中并使用 ItemTemplate 来显示您的项目。(见乔比乔伊的回答)

下面是一个使用 ItemContainerStyle 的示例:

    <ListBox
        x:Name="TestList"
        SelectionMode="Multiple">

        <ListBox.ItemContainerStyle>
            <Style
                TargetType="ListBoxItem">

                <Setter
                    Property="Template">
                    <Setter.Value>
                        <ControlTemplate
                            TargetType="ListBoxItem">
                            <StackPanel>
                                <CheckBox
                                    Content="Check this checkbox!" />
                                <TextBlock
                                    Text="{TemplateBinding Content}" />
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>

            </Style>
        </ListBox.ItemContainerStyle>

        <ListBox.Items>
            <ListBoxItem>Bob</ListBoxItem>
            <ListBoxItem>Jim</ListBoxItem>
            <ListBoxItem>Dave</ListBoxItem>
            <ListBoxItem>Larry</ListBoxItem>
            <ListBoxItem>Tom</ListBoxItem>
        </ListBox.Items>
    </ListBox>
于 2010-03-16T18:26:11.187 回答
0

出于某种原因,如果使用 ItemsSource 填充 ListBox,仍然可以忽略 DataTemplate,例如:

    <ListBox Name="Test" x:FieldModifier="public" ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

请注意,这绑定到包含具有一个属性的对象(TextAdapter:INotifyPropertyChanged)的 ObservableCollection:string Text {...}

于 2013-08-29T09:13:11.457 回答