从ListBox升级到CollectionViewSource不起作用

时间:2013-01-19 17:41:03

标签: silverlight windows-phone-7 listbox collectionviewsource

我已经有一个工作ListBox,包含我本地数据库中的Items。现在我想将它升级到CollectionViewSource进行过滤。升级后,带有CollectionViewSource的新ListBox没有显示任何内容。

MainPage代码背后:

    // Data context for the local database
    private BuildingDataContext toDoDB;

    // Define an observable collection property that controls can bind to.
    private ObservableCollection<Building> _buildings;
    public ObservableCollection<Building> BuildingTable
    {
        get
        {
            return _buildings;
        }
        set
        {
            if (_buildings != value)
            {
                _buildings = value;
                NotifyPropertyChanged("BuildingTable");
            }
        }
    }

    public CollectionViewSource Source { get; set; }

    // Konstruktor
    public MainPage()
    {
        InitializeComponent();
        // Connect to the database and instantiate data context.
        toDoDB = new BuildingDataContext(BuildingDataContext.DBConnectionString);

        // Data context and observable collection are children of the main page.
        this.DataContext = this;
    }

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        // Define the query to gather all of the to-do items.
        var toDoItemsInDB = from Building todo in toDoDB.BuildingTable
        select todo;

        // Execute the query and place the results into a collection.
        BuildingTable = new ObservableCollection<Building>(toDoItemsInDB);

        Source = new CollectionViewSource();
        Source.Source = BuildingTable;

        // Call the base method.base.OnNavigatedTo(e);
    }

为此,我添加了以下几行:

public CollectionViewSource Source { get; set; }
Source = new CollectionViewSource();
Source.Source = BuildingTable;

我也试过把

Source = new CollectionViewSource();
Source.Source = BuildingTable;

在我的MainPage构造函数中。它也不起作用。

我的主页xaml:

        <!--<ListBox x:Name="toDoItemsListBox" ItemsSource="{Binding BuildingTable}" Grid.Row="0" Margin="12, 0, 12, 0" Width="440" SelectionChanged="goToNavigation">-->
        <ListBox x:Name="toDoItemsListBox" ItemsSource="{Binding Source.View}" Grid.Row="0" Margin="12, 0, 12, 0" Width="440" SelectionChanged="goToNavigation">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid HorizontalAlignment="Stretch" Width="440">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="100" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Name="textBlockShortcut" Text="{Binding Shortcut}" Width="Auto" HorizontalAlignment="Left" Grid.Column="0" Margin="0,0,0,5" FontSize="36" />
                        <TextBlock Name="textBlockName" Text="{Binding BuildingName}" Width="Auto" HorizontalAlignment="Left" Grid.Column="1" Margin="0,0,0,5" FontSize="36" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

第一个注释行显示没有CollectionViewSource的旧工作列表框。那我错过了什么?

编辑:

    private void goToNavigation(object sender, RoutedEventArgs e)
    {
        // If selected index is -1 (no selection) do nothing
        if (toDoItemsListBox.SelectedIndex == -1)
            return;

        // Navigate to the new page
        PhoneApplicationService.Current.State["SelectedItem"] = toDoItemsListBox.SelectedItem;
        NavigationService.Navigate(new Uri("/NavigationPage.xaml", UriKind.Relative));

        // Reset selected index to -1 (no selection)
        toDoItemsListBox.SelectedIndex = -1;
    }

2 个答案:

答案 0 :(得分:2)

您通常会在XAML中创建并绑定到CollectionViewSource:

<UserControl.Resources>
    <CollectionViewSource x:Key="cvs"/>
</UserControl.Resources>
<Grid>
    <ListBox ItemsSource="{Binding Source={StaticResource cvs}}" ...>
        ...
    </ListBox>
</Grid>

并且在代码隐藏中只需像这样访问CollectionViewSource:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    ... 
    var cvs = Resources["cvs"] as CollectionViewSource;
    cvs.Source = BuildingTable;
}

答案 1 :(得分:1)

您不直接使用CollectionViewSource类,而是使用相应类型的CollectionView。

View = CollectionViewSource.GetDefaultView( myCollection );

然后将其直接绑定到您的源。

ItemsSource="{Binding View}"

你可以而且只应该使用xaml的CollectionViewSource,因为这是它的主要目的。从代码中,您应该直接创建CollectionView或使用GetDefaultView方法。