darking050
darking050

Reputation: 637

No data with ListBox with Grid inside

I am doing a Grid of two columns that are inside a ListBox. That after that I can DataBind the two columns to be repeated vertically.

So far the code below shows nothing on the WP7 emulator.

<ListBox Background="Yellow" ItemsSource="{Binding}" Height="100" Margin="0,0,8,0">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Height="100">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<TextBlock Text="Channels" HorizontalAlignment="Stretch" Foreground="Black" Grid.Column="0" />
<TextBlock Text="Antenna" HorizontalAlignment="Stretch" Foreground="Black" Grid.Column="1"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

Please help me.

Upvotes: 0

Views: 376

Answers (2)

William Melani
William Melani

Reputation: 4268

If you want design-time itemssource, you can use the IsInDesignMode property like so:

 if (System.ComponentModel.DesignerProperties.IsInDesignTool)
            {
                myListBox.ItemsSource = GenerateMockItems();
            }
            else
            {
                myListBox.ItemsSource = GetRealItems();
            }

in MVVMLight ViewModels, this is shortcut-ed as

    if (IsInDesignMode)
    {

    }

Similarly, since it looks like you're setting your ItemsSource in xaml, inside your class that is your DataContext, you could do something like

public class MyViewModel
{
  public MyViewModel()
  {
     if (System.ComponentModel.DesignerProperties.IsInDesignTool)
                {
                    Items = GenerateMockItems();
                    EditTime = GenerateRandomFutureDate();
                }
                else
                {
                   //whatever you expect should happen in runtime
                }
  }

  //what list is binding to
  public ObservableCollection<Item> Items { get; set; }

   //other properties.. for example
   public bool HasItems { get { return Items != null && Items.Count > 0; } }

   public DateTime EditDate { get; set; }

   private ObservableCollection<Item> GenerateMockItems()
  {
      var collection = new ObservableCollection<Item>();
      for (int i = 0; i < 10; i++)
      {
          collection.Add(new Item() { Name="sdfsdfs" , Channel=i });
      }
      return collection;
  }
  private DateTime GenerateRandomFutureDate()
  {
      return DateTime.Now.AddSeconds(new Random().Next(0,50000));
  }
}

Upvotes: 1

Jan Slodicka
Jan Slodicka

Reputation: 1515

If your only concern is that you see ItemTemplate in action, you can supply explicit non-UI items as follows:

<ListBox Background="Yellow" Height="100" Margin="0,0,8,0" xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Height="30">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="200" />
                    <ColumnDefinition Width="200" />
                </Grid.ColumnDefinitions>
                <TextBlock Text="Channels" HorizontalAlignment="Stretch" Foreground="Black" Grid.Column="0" />
                <TextBlock Text="Antenna" HorizontalAlignment="Stretch" Foreground="Black" Grid.Column="1"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <sys:String>1111111</sys:String>
    <sys:String>2222222</sys:String>
    <sys:String>3333333</sys:String>
</ListBox>

Notes:

  • I removed ItemsSource and supplied items explicitly.
  • Items must not derive from UIElement so that they are templated. (UIElements are simply drawn and the template is ignored.)
  • I added System namespace so that string objects can be specified.
  • I decreased ItemTemplate height so that more than one list row is visible.

Easier solution: Give the ListBox a name and remove the binding:

<ListBox x:Name="myLB" Background="Yellow" Height="100" Margin="0,0,8,0"> 

Then use this line in the code (after the call InitializeComponent()):

myLB.ItemsSource = new List<string> { "First", "Second", "Third" };

Upvotes: 1

Related Questions