ListBox数据控件未显示信息

时间:2013-07-26 15:53:49

标签: c# .net wpf listbox stackpanel

首次使用ListBox并在跟随this之后,我遇到了实际显示数据的问题。 ListBox只是空白,没有文字。

我创建了一个单独的文本框来测试单个“Tweet”对象,它确实输出了我想要的内容。我认为我的问题在于XAML或推文。但没有什么不合适的地方。

跟踪显示推文成功添加了我需要的正确Tweet对象。但我的ListBox计数始终为0。

<Grid Opacity="0.8">
        <Grid.Resources>
            <local:Tweets x:Key="tweets"/>
        </Grid.Resources>
        <Rectangle Fill="Gray" Margin="1523,0,0,729" Height="321" Width="389">
            <Rectangle.Effect>
                <DropShadowEffect/>
            </Rectangle.Effect></Rectangle>
        <ListBox ItemsSource="{StaticResource tweets}" Height="321" Margin="340,40,1096,0" x:Name="twitterBox" VerticalAlignment="Top" Width="476">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Height="132">
                        <!--<Image Source="{Binding imgSrc}" Height="73" Width="73" VerticalAlignment="Top" Margin="0,10,8,0"/>-->
                        <StackPanel Width="370">
                            <TextBlock Text="{Binding user}"  FontSize="28" />
                            <TextBlock Text="{Binding tweet}" TextWrapping="Wrap" FontSize="24" />
                        </StackPanel>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
  </Grid>

在我的cs中:

 public class Tweet
{
       public String imgSrc { get; set; }
        public String user { get; set; }
        public String tweet { get; set; }

        public Tweet(String user, String tweet, String img)
        {
            this.imgSrc = img;
            this.user = user;
            this.tweet = tweet;
        }
}

public class Tweets : ObservableCollection<Tweet>
{
    public Tweets()
    {

    }

    public void addTweet(Tweet tweet)
    {
        Add(tweet);
    }
}


public void SomeFunction()
{
      Tweets myTwitter = new Tweets();
      myTwitter.addTweet(new Tweet(tweet.User.ScreenName, tweet.Text, tweet.User.ProfileImageUrl));
}

2 个答案:

答案 0 :(得分:1)

ItemTemplate代码没问题,但您应该删除此Margin="1523,0,0,729"

ListBox为空,因为商品来源为空。你应该添加一些项目。

要在XAML中添加项目,您应该将默认构造函数添加到Tweet类。

public class Tweet
{
    public String imgSrc { get; set; }
    public String user { get; set; }
    public String tweet { get; set; }

    public Tweet(){}

    public Tweet(String user, String tweet, String img)
    {
        this.imgSrc = img;
        this.user = user;
        this.tweet = tweet;
    }
}

现在你可以这样写:

...
<Grid.Resources>
    <local:Tweets x:Key="tweets">
        <local:Tweet imgSrc="imgSrc1" user="user1" tweet="tweet1" />
        <local:Tweet imgSrc="imgSrc2" user="user2" tweet="tweet2" />
    </local:Tweets>
</Grid.Resources>
...

结果:

enter image description here

在代码隐藏中添加项目。

要做到这一点,你应该使用函数:FindResourcemsdn)。

XAML:

<Grid Name="mainGrid" Opacity="0.8">
    <Grid.RowDefinitions>
        <RowDefinition Height="30" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.Resources>
        <local:Tweets x:Key="tweets">
            <local:Tweet imgSrc="imgSrc1" user="user1" tweet="tweet1" />
            <local:Tweet imgSrc="imgSrc2" user="user2" tweet="tweet2" />
        </local:Tweets>
    </Grid.Resources>
    <Button Content="Add new item" Click="Button_Click" />
    <ListBox x:Name="twitterBox" ItemsSource="{StaticResource tweets}" 
             VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
             Grid.Row="1">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Height="132">
                    <!--<Image Source="{Binding imgSrc}" Height="73" Width="73" VerticalAlignment="Top" Margin="0,10,8,0"/>-->
                    <StackPanel Width="370">
                        <TextBlock Text="{Binding user}"  FontSize="28" />
                        <TextBlock Text="{Binding tweet}" TextWrapping="Wrap" FontSize="24" />
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

代码隐藏:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var coll = mainGrid.FindResource("tweets") as Tweets;
    if (coll != null)
    {
        coll.Add(new Tweet("user", "name", "url"));
    }
}

第二个解决方案:

如果您要在后面的代码中创建类Tweets的实例,那么更好的解决方案就是。

XAML:

<Grid Name="mainGrid" Opacity="0.8">
    <Grid.RowDefinitions>
        <RowDefinition Height="30" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>      
    <Button Content="Add new item" Click="Button_Click" />
    <ListBox x:Name="twitterBox" ItemsSource="{Binding tweets}" 
             VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
             Grid.Row="1">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Height="132">
                    <!--<Image Source="{Binding imgSrc}" Height="73" Width="73" VerticalAlignment="Top" Margin="0,10,8,0"/>-->
                    <StackPanel Width="370">
                        <TextBlock Text="{Binding user}"  FontSize="28" />
                        <TextBlock Text="{Binding tweet}" TextWrapping="Wrap" FontSize="24" />
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        tweets = new Tweets();

        tweets.Add(new Tweet("user1", "name1", "url1"));
        tweets.Add(new Tweet("user2", "name2", "url2"));
        tweets.Add(new Tweet("user3", "name3", "url3"));

        this.DataContext = this;
    }

    public Tweets tweets { get; set; }

    private void Button_Click(object sender, RoutedEventArgs e)
    {          
        tweets.Add(new Tweet("user4", "name4", "url4"));
    }
}

答案 1 :(得分:0)

您可以将推文添加到与列表框显示的集合不同的集合中。