1

ローカルデータベースのアイテムを含むリストボックスがすでに機能しています。ここで、これをフィルタリング用のCollectionViewSourceにアップグレードしたいと思いました。アップグレード後、CollectionViewSourceを含む新しいリストボックスには何も表示されません。

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コンストラクターで。それもうまくいきません。

私の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;
    }
4

2 に答える 2

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;
}
于 2013-01-19T19:26:31.883 に答える
1

CollectionViewSourceクラスを直接使用するのではなく、適切なタイプのCollectionViewを使用します。

View = CollectionViewSource.GetDefaultView( myCollection );

次に、それをソースに直接バインドします。

ItemsSource="{Binding View}"

xamlのCollectionViewSourceを使用できるのは、それが主な目的であるためです。コードから、CollectionViewを直接作成するか、GetDefaultViewメソッドを使用する必要があります。

于 2013-01-19T18:33:40.353 に答える