CollectionViewSource не может быть DataBound в XAML, но может в CodeBehind? - PullRequest
2 голосов
/ 10 января 2011

Надеюсь, это имеет смысл.

У меня есть приложение для Windows Phone 7, использующее шаблон приложения Windows Phone Databound.

Мне нужно отсортировать свой ListBox, связанный с ViewModel, поэтому я создал CollectionViewSource в XAML и установил для ListBox ItemSource значение CollectionViewSource. В Designer все работает отлично, и я вижу SampleData просто великолепно. Однако, когда я запускаю приложение, возникает исключение:

System.Windows.Markup.XamlParseException не было обработано Сообщение = AG_E_PARSER_BAD_PROPERTY_VALUE [Строка: 33 Позиция: 31] LineNumber = 33 LinePosition = 31

XAML, о котором идет речь, таков:

<CollectionViewSource Source="{Binding Items}" x:Key="ItemsSort" >
    <CollectionViewSource.SortDescriptions>
        <compMod:SortDescription PropertyName="Order" Direction="Ascending"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

ListBox:

<Grid>
    <ListBox x:Name="MainListBox" ItemsSource="{Binding Source={StaticResource ItemsSort}}">
        <ListBox.ItemTemplate>
            <DataTemplate>

Теперь, если я удалю Source = "{Binding Items}" из CollectionViewSource и вместо этого установлю его с помощью кода:

CollectionViewSource itemsView = this.Resources["ItemsSort"] as CollectionViewSource;
itemsView.Source = App.ViewModel.Items;

Все работает во время выполнения, но, конечно, имеющиеся у меня образцы данных не появляются во время разработки.

Я не могу по-настоящему понять, почему существует такая ситуация, и я хотел бы иметь гибкость для просмотра образцов данных во время разработки и использования XAML для настройки привязок данных.

Ответы [ 4 ]

1 голос
/ 27 августа 2011

Я всегда делал свой CollectionViewSource свойством модели представления.Я никогда не пробовал это со статическим ресурсом, как вы делаете, но подсказка ниже может помочь вам в любом случае.

Для привязки ListBox ItemsSource следует установить значение CollectionViewSource.View, а не CollectionViewSource.

Попробуйте это в вашей модели представления:

ItemsSort = new CollectionViewSource();
ItemsSort.Add(new System.ComponentModel.SortDescription("Order", System.ComponentModel.ListSortDirection.Ascending));
ItemsSort.Source = Items;

Попробуйте это в своем XAML (обратите внимание на .View в пути привязки):

<ListBox x:Name="MainListBox" ItemsSource="{Binding Path={ItemsSort.View}}">

Редактировать: вышеупомянутая подсказка была полнойSilverlight - надеюсь, это работает и для Windows Phone, но я не пробовал.

0 голосов
/ 13 марта 2014

Просто для ясности: Windows Phone не поддерживает CollectionViewSource

http://msdn.microsoft.com/ru-ru/library/system.windows.data.collectionviewsource.sortdescriptions(v=vs.110).aspx

Platforms
Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)
0 голосов
/ 12 февраля 2011

В моем случае, лучше всего было просто отсортировать ItemCollection в коде и даже не беспокоиться о CollectionViewSource.

Я нашел класс списка переупорядочивания, который также позаботился об этом автоматически.

http://blogs.msdn.com/b/jasongin/archive/2011/01/03/wp7-reorderlistbox-improvements-rearrange-animations-and-more.aspx

0 голосов
/ 11 января 2011

Сколько других клиентов ресурса ItemsSort есть на странице.Размещение привязки к чему-либо в словаре ресурсов всегда кажется мне немного странным.

Попробуйте: -

<ListBox x:Name="MainListBox">
    <ListBox.ItemsSource>
        <CollectionViewSource Source="{Binding Items}">
            <CollectionViewSource.SortDescriptions>
                <compMod:SortDescription PropertyName="Order" Direction="Ascending"/>
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource> 
    </ListBox.ItemsSource>
...