2014-12-08 3 views
1

Я пытаюсь связать ObservableCollection пользовательских объектов, называемых ItemGroup, который сам по себе содержит ObservableCollection из Item объектов (среди других свойств) в LongListSelector (создать группировку Item объектов) в WP8 0,1 Silverlight:Уплотненный коллекция LLS ItemsSource связывания с группировкой

public class Item : INotifyPropertyChanged { 
    private string _name = ""; 
    public string Name { 
     get { 
      return _name; 
     } 
     set { 
      if (value != _name) { 
       _name = value; 
       NotifyPropertyChanged("Name"); 
      } 
     } 
    } 

    private int _cost = 0; 
    public int Cost { 
     get { 
      return _cost; 
     } 
     set { 
      if (value != _cost) { 
       _cost = value; 
       NotifyPropertyChanged("Cost"); 
      } 
     } 
    } 
} 

public class ItemGroup : INotifyPropertyChanged { 
    private string _groupName = ""; 
    public string GroupName { 
     get { 
      return _groupName; 
     } 
     set { 
      if (value != _groupName) { 
       _groupName = value; 
       NotifyPropertyChanged("GroupName"); 
      } 
     } 
    } 

    private int _totalCost = 0; 
    public int TotalCost { 
     get { 
      return _totalCost; 
     } 
     set { 
      if (value != _totalCost) { 
       _totalCost = value; 
       NotifyPropertyChanged("TotalCost"); 
      } 
     } 
    } 

    private ObservableCollection<Item> _items = new ObservableCollection<Item>(); 
    public ObservableCollection<Item> Items { 
     get { 
      return _items; 
     } 
     set { 
      if (value != _items) { 
       _items = value; 
       NotifyPropertyChanged("Items"); 
      } 
     } 
    } 
} 

ViewModel содержит свойство:

private ObservableCollection<ItemGroup> _itemGroupList = new ObservableCollection<ItemGroup>(); 
public ObservableCollection<ItemGroup> ItemGroupList { 
    get { 
     return _itemGroupList; 
    } 
    set { 
     if (value != _itemGroupList) { 
      _itemGroupList = value; 
      NotifyPropertyChanged("ItemGroupList"); 
     } 
    } 
} 

И в XAML:

<phone:LongListSelector ItemsSource="{Binding ItemGroupList}"> 

    <!-- Template for ItemGroup Items --> 
    <phone:LongListSelector.ItemTemplate> 
     <DataTemplate> 
     <Grid Height="Auto" Margin="12,0,2,15"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 

      <!-- Item Name --> 
      <TextBlock Text="{Binding Items.Name}" Grid.Column="0"/> 

      <!-- Item Cost --> 
      <TextBlock Text="{Binding Items.Cost, StringFormat='{}{0} dollars'}" Grid.Column="1"/> 
     </Grid> 
    </DataTemplate> 
    </phone:LongListSelector.ItemTemplate> 


    <!-- Template for ItemGroup headers --> 
    <phone:LongListSelector.GroupHeaderTemplate> 
     <DataTemplate> 
      <Grid Background="#FFA2A2A2" Margin="0,10"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="*"/> 
       </Grid.ColumnDefinitions> 

       <!-- ItemGroup Group Name --> 
       <TextBlock Grid.Column="0" Text="{Binding GroupName}"/> 

       <!-- ItemGroup Total Cost --> 
       <TextBlock Grid.Column="1" Text="{Binding TotalCost}"/> 
      </Grid> 
     </DataTemplate> 
    <phone:LongListSelector.GroupHeaderTemplate> 
</phone:LongListSelector> 

Что не работает. Прямые свойства ItemGroupTotalCost) правильно связывают и видны, но не отображаются Item объектов! Я подозреваю, что это потому, что я перехожу к ItemTemplate неправильному источнику? Я попытался связать коллекцию непосредственно в LLS на ItemSource={Binding ItemGroupList.Items}, но это тоже не работает.

Update: Привязка управления заголовка к Items.Count дает фактическое количество Item объектов внутри Items из ItemGroup, что свидетельствует о том, что на самом деле существует список Item объектов для каждого ItemGroup.

ответ

1

Обратите внимание, что у вас есть вложенная коллекция, поэтому вам понадобятся два элемента управления. Вы не можете привязываться к «Items.Name» или «Items.Cost», потому что это не свойства. Вы можете использовать «Items [0] .name», но я думаю, что вы, вероятно, хотите, чтобы перечислить все детали, что-то вроде этого (внутри «LongListSelector.ItemTemplate»):

<ItemsControl ItemsSource="{Binding Items}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="*"/> 
       </Grid.ColumnDefinitions> 
       <!-- Item Name --> 
       <TextBlock Text="{Binding Items.Name}" Grid.Column="0"/> 

       <!-- Item Cost --> 
       <TextBlock Text="{Binding Items.Cost, StringFormat='{}{0} dollars'}" Grid.Column="1"/> 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

Спасибо! Я предполагаю, что я пытался избежать управления вложенности, поскольку это могло противоречить рекомендациям по разработке WP. Это решение работает! –

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