views:

1096

answers:

2

In WPF app I have a WCF service which dynamically fills a generic List object from a backend database.

How in this case (List created in runtime), I could bind List items to a ListView object items?

It is the Data contract for my Web service:

....
[DataContract]
public class MeetList
{
    [DataMember]
    public string MeetDate;
    [DataMember]
    public string MeetTime;
    [DataMember]
    public string MeetDescr;

 .....

 static internal List<MeetList> LoadMeetings(string dynamicsNavXml)
    {
        ...// Loads  XML stream into the WCF type
    }

Here in this event handler I read the WCF service and Loop through a List object:

       private void AllMeetings()
    {
        Customer_ServiceClient service = new Customer_ServiceClient();
        foreach (MeetList meet in service.ReadMeetList())
        {
            ?????? = meet.MeetDate; // it's here that I bumped into a problem
            ?????? = meet.MeetTime; //
            ?????? = meet.MeetDescr;//
        }

    }

My Listview XAML:

                            <Grid>
                                <ListView Height="100" Width="434" Margin="0,22,0,0" Name="lvItems" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" SelectionMode="Single">
                                    <ListView.View>
                                        <GridView>
                                            <GridViewColumn Header="Date" Width="100" HeaderTemplate="{StaticResource DateHeader}" CellTemplate="{DynamicResource DateCell}"/>
                                            <GridViewColumn Header="Time" Width="100" HeaderTemplate="{StaticResource TimeHeader}" CellTemplate="{DynamicResource TimeCell}"/>
                                            <GridViewColumn Header="Description" Width="200" HeaderTemplate="{StaticResource DescriptionHeader}" CellTemplate="{DynamicResource DescriptionCell}"/>
                                        </GridView>
                                    </ListView.View>
                                </ListView>
                            </Grid>

And data templates for this ListView:

<Window.Resources>
    <DataTemplate x:Key="DateHeader">
        <StackPanel Orientation="Horizontal">
            <TextBlock Margin="10,0,0,0" Text="Date" VerticalAlignment="Center" />
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="DateCell" DataType="Profile">
        <StackPanel Orientation="Horizontal">
            <TextBlock>
                    <TextBlock.Text>
                        <Binding Path="MeetDate" />
                    </TextBlock.Text>
            </TextBlock>
        </StackPanel>
    </DataTemplate>
......

How in this case (List created in runtime), I could bind my generic List items to a ListView object items?

I tried to use lvItems.ItemsSource = profiles; , but it doesn't work in my event handler

+3  A: 

List doesn't have behaviour to notify that items count is changed. You should use a list with support INotifyCollectionChanged.. for example: ObservableCollection<T>. ObservableCollection<T> will inform your lvItems that items count is changed and it will be properly display.

RredCat
I think I don't need INotifyCollectionChanged because I loop through WCF sevice refreshed List, but thanks for help anyway, you put me on the right way. I used intermediate ObservableCollection and now everything is working. I put my solution as an answer to be readable. Thanks. +1
rem
A: 

Using intermediate ObservableCollection:

ObservableCollection<Meets> _MeetCollection =
            new ObservableCollection<Meets>();

    public ObservableCollection<Meets> MeetCollection
    { get { return _MeetCollection; } }


    public class Meets
    {
        public string Date { get; set; }
        public string Time { get; set; }
        public string Description { get; set; }

    }

In the event handler loop we put:

       private void AllMeetings()
    {
        Customer_ServiceClient service = new Customer_ServiceClient();
        _MeetCollection.Clear();
        foreach (MeetList meet in service.ReadMeetList())
        { 
            _MeetCollection.Add(new Meets
            {
                Date = meet.MeetDate,
                Time = meet.MeetTime,
                Description = meet.MeetDescr
            });                               
        }            
    }

And XAML binding is changed to:

<Grid>
   <ListView Height="100" Width="434" Margin="0,22,0,0" Name="lvItems" ItemsSource="{Binding MeetCollection}">
      <ListView.View>
         <GridView>
          <GridViewColumn Header="Date" Width="100" DisplayMemberBinding="{Binding Date}"/>
          <GridViewColumn Header="Time" Width="100" DisplayMemberBinding="{Binding Time}"/>
          <GridViewColumn Header="Description" Width="200" DisplayMemberBinding="{Binding Description}"/>
         </GridView>
       </ListView.View>
     </ListView>
   </Grid>
rem