我似乎无法在WPF中使DataTemplate起作用

3

我曾经尝试了几种不同的方法来实现一个简单的DataTemplate示例,但是一直没有成功。下面的XAML数据上下文是在代码后台中设置的。这里包含的两个代码示例都被包裹在我的应用程序中的“<Grid>”元素中,但那是唯一需要考虑的外部因素。第一个代码示例有效,它可以显示数据。但是,如果我将功能放在DataTemplate中,然后尝试使用该模板,它就无法工作。

有效示例:

    <Canvas Height="100" Width="300">
        <TextBlock Text="{Binding Path=DataSheet.Item.ClassId}" Canvas.Left="10"></TextBlock>
        <TextBlock Text="{Binding Path=DataSheet.Item.ClassName}" Canvas.Right="100"></TextBlock>
    </Canvas>

不起作用的示例(但不会抛出错误):

<Window.Resources>
    <DataTemplate x:Key="FirstTemplate">
        <Grid Margin="4">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" SharedSizeGroup="Key" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <TextBox Text="{Binding ClassId}"></TextBox>
            <TextBox Text="{Binding ClassName}"></TextBox>
        </Grid>
    </DataTemplate>
</Window.Resources>
<Grid>
    <ListBox ItemsSource="{Binding Path=DataSheet.Item}" Grid.IsSharedSizeScope="True"
             HorizontalAlignment="Stretch"
             ItemTemplate="{StaticResource ResourceKey=FirstTemplate}"/>
</Grid>

任何关于我做错了什么的建议都将不胜感激。谢谢。
3个回答

4

您的ItemSource应该是一个集合,而DataSheet.Item看起来像是单个项目。您应该将其包装成集合。

或者您可以手动添加ListBoxItem

<ListBox>
    <ListBoxItem Content="{Binding DataSheet.Item}" ContentTemplate="{StaticResource FirstTemplate}"/>
</ListBox>

这个可行。谢谢!我还得把DataTemplate改成ControlTemplate,但是其他的都没变。这是一个开始。现在我可以在此基础上添加更复杂的东西了。我猜问题可能是集合与项之间的区别,但我还没有完全搞清楚。再次感谢。 - rogdawg

0
从您提供的工作代码来看,我认为DataSheet.Item不是IEnumerable。如果它不是IEnumerable,将其绑定到ListBox.ItemsSource似乎不合适。

谢谢你指出这一点。这是一个我忽略了的重要区别。如果Item是IEnumerable,我猜想一切都会正常工作(我没有尝试过)。在这种情况下,我将坚持单个对象,因为逻辑上更合适。但是你的评论让我更清楚了,我将在实现其他页面/表单时牢记它。再次感谢。 - rogdawg

-1

试试这个:

  <ListBox ItemsSource="{Binding Path=DataSheet.Item}" Grid.IsSharedSizeScope="True"
             HorizontalAlignment="Stretch"
             ItemTemplate="{StaticResource FirstTemplate}"/>

这里有一个链接,可以获取更多信息


我尝试了这个,但没有任何效果。感谢您的帮助。我将上面的答案标记为“最佳答案”。再次感谢。 - rogdawg
你的代码与他的代码基本相同。它们都在StaticResourceExtension上设置了ResourceKey属性。你的链接底部也有提到这一点 :-) - CodeNaked

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接