WPF列表框:如何绑定数据?

时间:2011-07-16 21:48:43

标签: c# wpf xaml data-binding listbox

我有一个listBox并像这样添加数据:

for (int x = 0; x < Orchestrator.Instance.getTopicCount(); x++)
{
   listTopics.Items.Add(Orchestrator.Instance.getTopic(x));
}

但是我需要能够做一些事情,比如文本换行和分隔线,所以我想把它做成XAML。

微软展示了这一点:

<TextBlock Width="248" Height="24" 
Text="{Binding ElementName=lbColor, Path=SelectedItem.Content, 
Mode=OneWay}" 
x:Name="tbSelectedColor" 
Background="{Binding ElementName=lbColor, Path=SelectedItem.Content, 
Mode=OneWay}"/>

但我真的不明白。这是我的XAML:

<ListBox Height="261" HorizontalAlignment="Left" Margin="352,38,0,0" Name="listContent"     VerticalAlignment="Top" Width="391" Grid.Column="1" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" MaxWidth="391" ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>

我怎样才能达到我想要的目标? (分隔线,文本换行,所以我不必水平滚动,数据绑定)

4 个答案:

答案 0 :(得分:1)

似乎你必须首先提升如何在WPF中使用数据绑定的相当陡峭的学习曲线。此后,您应该了解DataTemplates和ItemTemplates以获取分隔符等等。 尝试this让您入门

我衷心推荐的一本书是Manning的 WPF in Action

答案 1 :(得分:1)

您需要定义ListBox的ItemTemplate。 在您的资源中,添加以下内容:

<DataTemplate x:Key="myItemTemplate" TargetType="ListBoxItem">
    <TextBlock Text="{Binding}"/>
</DataTemplate>

假设您的getTopic方法返回一个字符串,否则使用{Binding MyTopicProperty}其中MyTopicProperty是您的Topic类中的属性。根据需要自定义TextBlock。

然后像这样使用ListBox:

<ListBox ItemTemplate="{StaticResource myItemTemplate"/>

答案 2 :(得分:1)

要指定每个项目的布局,可以更改两个不同的内容:ItemContainerStyle,它提供用于每个ListBoxItem的ControlTemplate,或ItemTemplate,它提供用于呈现每个数据项的DataTemplate。如果您刚刚开始并且还没有掌握ControlTemplates,那么ItemTemplate更易于使用。

要让文字换行,有两件事要做。关闭ListBox的默认水平滚动(已经有),并将TextBlock的TextWrapping属性设置为Wrap。要进入TextBlock,您需要在ItemTemplate中定义它。这是一个内联声明的模板的简单示例,但您也可以将其作为资源拉出来。对于分界线,我使用边框的最简单方法,只有底部黑线。

<ListBox x:Name="listContent" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border BorderThickness="0,0,0,1" BorderBrush="Black">
                <TextBlock Text="{Binding}" TextWrapping="Wrap"/>
            </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

答案 3 :(得分:0)

以下是如何使用DataTemplate将列表框与RSS源绑定的示例:

<UserControl.Resources>
        <XmlDataProvider x:Key ="DataRSS" XPath="//item" Source="http://rss.feedsportal.com/c/629/f/502199/index.rss">< /XmlDataProvider>
    </UserControl.Resources>

<StackPanel Orientation="Horizontal"  HorizontalAlignment="Center">

            <ListBox  ItemsSource="{Binding Source={StaticResource DataRSS}}"  Height="516" Margin="0,0,32,0" Background="{x:Null}" BorderBrush="#FF627DAE">
                <ListBox.ItemTemplate >
                    <DataTemplate >
                        <Grid Width="400" Height="100"  >                                

                            <Image Source="{Binding XPath=enclosure/@url}" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Top"  />
                            <TextBlock TextWrapping="Wrap" Text="{Binding XPath=title}" FontWeight="Bold" Grid.Column="2"/>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </StackPanel>
</grid>