2015-04-08 4 views
0

Я пытаюсь получить привязку данных, мне нужно работать с ListBox. Я проанализировал некоторые данные из текстового файла до ObservableCollection<ViewModel>, но данные не обновляются в ListBox.C# wpf listbox не обновляется с ObservableCollection

Вот некоторая информация:

Данные, которые записываются в от парсера:

class MainData 
{ 
    private static ObservableCollection<GroupViewModel> groupModelList = new ObservableCollection<GroupViewModel>(); 
    public static ObservableCollection<GroupViewModel> GroupModelList 
    { 
     get { return groupModelList; } 
    } 
} 

Что GroupViewModel держит (не все, но это все равно):

class GroupViewModel : INotifyPropertyChanged 
{ 
    private GroupModel groupModel; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public GroupViewModel() 
    { 
     groupModel = new GroupModel(); 
    } 

    public string Name 
    { 
     get { return groupModel.name; } 
     set 
     { 
      if (groupModel.name != value) 
      { 
       groupModel.name = value; 
       InvokePropertyChanged("Name"); 
      } 
     } 
    } 

    ... 
} 

И что GroupModel Помещения:

class GroupModel 
{ 
    public string name { get; set; } 
} 

Это как анализатор добавляет новые элементы к GroupModelView:

if (split[0] == "group") 
{ 
    currentGroup = new GroupViewModel(); 
    currentGroup.Name = split[1]; 

    MainData.GroupModelList.Add(currentGroup); 
} 

Я создал ListBox в моем WPF приложения с этими опциями XAML:

<Window x:Class="SoundManager.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:SoundManager.ViewModels" 
    xmlns:vm2="clr-namespace:SoundManager.Code" 
    Title="MainWindow" Height="720" Width="1280"> 
<Window.Resources> 
    <vm:MainViewModel x:Key="MainViewModel" /> 
    <vm2:MainData x:Key="MainData" /> 
</Window.Resources> 

<ListBox Grid.Row="2" Height="484" HorizontalAlignment="Left" Margin="12,0,0,0" Name="lbFoundItems" VerticalAlignment="Top" Width="201" ItemsSource="{Binding Source={StaticResource MainData}, Path=GroupModelList/Name}" /> 

, но по какой-то причине ISN данных Обновление в пользовательском интерфейсе (в пользовательском интерфейсе явно не отображаются новые элементы).
Я только начинал с шаблона MVVM и привязки данных, и я не могу понять, что я делаю неправильно.

Заранее благодарен!

ответ

4

GroupModelList/Name не является допустимым путем. Установка этого типа не приводит к тому, что ListBox показывает свойство Name элементов данных в коллекции GroupModelList.

Вы бы вместо этого установить DisplayMemberPath свойство ListBox в:

<ListBox ItemsSource="{Binding Source={StaticResource MainData}, Path=GroupModelList}" 
     DisplayMemberPath="Name"/> 

или установить ItemTemplate свойство:

<ListBox ItemsSource="{Binding Source={StaticResource MainData}, Path=GroupModelList}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Кроме того, GroupModelList свойство не должно быть статическим:

class MainData 
{ 
    private ObservableCollection<GroupViewModel> groupModelList = 
     new ObservableCollection<GroupViewModel>(); 

    public ObservableCollection<GroupViewModel> GroupModelList 
    { 
     get { return groupModelList; } 
    } 
} 

Затем вы смеетесь t есть MainData как собственности в вашей модели и привязать ListBox следующим образом:

<ListBox ItemsSource="{Binding Source={StaticResource MainViewModel}, 
           Path=MainData.GroupModelList}" .../> 
+0

Спасибо! Это решило проблему! Итак, как продолжение. Действительно ли я делаю это MVVM правильно? (Судя по тому, что вы можете видеть в вопросе) – Dries

+0

Если вы сделаете MainData свойством в MainViewModel, как было предложено в ответе, я бы сказал «да». – Clemens

+0

Хорошо! Хорошо знать. еще раз спасибо – Dries

Смежные вопросы