Предположение 1: UserDataViewModel действительно является ViewModel
Термин «ViewModel» в конце имени класса означает, что целью этого класса является поддержка определенного просмотр.Вы не ожидаете, что такая модель представления затруднит выполнение представлением, к которому она присоединена, своей работы.
Поэтому я бы предположил, что ваша "ViewModel" испорчена и нуждается в переработке.Начните с: -
public class EntryItem
{
public string Name {get; set;}
public CategoryItem Category {get; set;}
}
Ваш CategoryItem
не нуждается в свойстве коллекции entires, а ваш UserDataView
возвращает плоскую коллекцию всех EntryItem
объектов.Привязка проста.
<TextBlock Text="{Binding Name}"
TextWrapping="Wrap"
Margin="12,0,0,0"
Style="{StaticResource PhoneTextExtraLargeStyle}" />
<TextBlock Text="{Binding Category.Name}"
TextWrapping="Wrap"
Margin="12,-6,0,0"
Style="{StaticResource PhoneTextSubtleStyle}" />
Предположение 2: UserDataViewModel на самом деле не ViewModel
Возможно, что то, что вы называете моделью представления, на самом деле простомодель данных, упорядоченная в соответствии с ее хранилищем или общим использованием.Это объясняет, почему оно не соответствует требованиям фактического представления.
Я хотел бы представить еще одно предположение, которое в WP7, вероятно, будет верным (вероятно, в другом месте).При отображении представления содержимое коллекций не изменяется, равно как и названия элементов.Следовательно, наблюдаемая природа этих объектов (хотя, возможно, и полезна в других местах) не обязательна для работы представления.
Если эти предположения верны, тогда для представления элементов в представлении можно использовать преобразователь значений и дополнительный класс.более приемлемый способ: -
public class EntryHolder
{
public EntryItem Entry {get; set;}
public CategoryItem Category {get; set; }
}
public class CategoryToEntryItemExConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
UserDataViewModel model = value as UserDataViewModel;
if (model != null)
{
return model.Data.SelectMany(c => c.Entries
.Select(e => new EntryHolder() { Category = c, Entry = e})
);
}
else
{
return null;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Теперь вы можете настроить свой Xaml: -
<Grid x:Name="LayoutRoot">
<Grid.Resources>
<local:CategoryToEntryItemExConverter x:Key="ItemsConv" />
</Grid.Resources>
</Grid>
...
<ListBox x:Name="MyListBox"
Margin="0,0,-12,0"
ItemsSource="{Binding Converter={StaticResource ItemsConv}}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,17">
<!--This should display EntryItem.Name-->
<TextBlock Text="{Binding Entry.Name}"
TextWrapping="Wrap"
Margin="12,0,0,0"
Style="{StaticResource PhoneTextExtraLargeStyle}" />
<!--This should display CategoryItem.Name-->
<TextBlock Text="{Binding Category.Name}"
TextWrapping="Wrap"
Margin="12,-6,0,0"
Style="{StaticResource PhoneTextSubtleStyle}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>