Привязка данных WPF Listview к универсальному списку, динамически заполняемому службой WCF - PullRequest
3 голосов
/ 18 декабря 2009

В приложении WPF у меня есть служба WCF, которая динамически заполняет общий объект List из базы данных бэкэнда.

Как в этом случае (List созданный во время выполнения) я мог связать List элементы с элементами объекта ListView?

Это контракт данных для моего веб-сервиса:

....
[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
    }

Здесь, в этом обработчике событий, я читаю службу WCF и перебираю объект List:

       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;//
        }

    }

Мой список просмотра 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>

И шаблоны данных для этого 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>
......

Как в этом случае (List созданный во время выполнения) я мог связать свои общие List элементы с элементами объекта ListView?

Я пытался использовать lvItems.ItemsSource = profiles;, но он не работает в моем обработчике событий

Ответы [ 2 ]

8 голосов
/ 18 декабря 2009

Список не может сообщать об изменении количества элементов. Вы должны использовать список с поддержкой INotifyCollectionChanged .. например: ObservableCollection . ObservableCollection проинформирует ваши lvItems об изменении количества предметов и будет правильно отображаться.

5 голосов
/ 18 декабря 2009

Использование промежуточной коллекции 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; }

    }

В цикле обработчика событий мы помещаем:

       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
            });                               
        }            
    }

И привязка XAML изменена на:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...