13

「ContentTemplate」は、メンバー「FooList」(ObservableCollection)を持つオブジェクトを表示するDataTemplateです。

<DataTemplate x:Key="ContentTemplate">
    <ListBox ItemsSource="{Binding Path=FOO}">
        ...
    </ListBox>
</DataTemplate>

CollectionViewSourceを使用してそのFooListをフィルタリングできるようにする必要があります。これは通常簡単ですが、DataTemplate内でバインディングを機能させることができないようです。私はこれを試みました:

<DataTemplate x:Key="ContentTemplate">
    <DataTemplate.Resources>
        <CollectionViewSource x:Key="CVS" Source="{Binding Path=FooList}" Filter="FooFilter"/>
    <DataTemplate.Resources>
    <ListBox ItemsSource="{Binding Source={StaticResource CVS}}">

これから得られるエラーは次のとおりです。

System.Windows.Dataエラー:2:ターゲット要素の支配的なFrameworkElementまたはFrameworkContentElementが見つかりません。BindingExpression:Path = FooList; DataItem = null; ターゲット要素は'CollectionViewSource'(HashCode = 52991666); ターゲットプロパティは「ソース」(タイプ「オブジェクト」)です

これは、DataTemplateにバインドされたオブジェクトではなく、CollectionViewSourceで「FooList」を探しているように聞こえます。

だから...どうすればこれで正しいオブジェクトを見ることができますか?

4

3 に答える 3

31

私が理解しているように、DataTemplate はビジュアル ツリーに何を挿入するかについての指示として機能しますが、ビジュアル ツリー自体の一部にはなりません。あなたが上で説明したのと同じ問題に遭遇した後、私はこの仮説にたどり着きました。ビジュアル ツリーの一部となる要素 (私の場合はグリッド) のリソースに CollectionViewSource をアタッチすることで、この問題を修正しました。動作したサンプルは次のとおりです。

<DataTemplate DataType="{x:Type TypedLists:AssetModelListViewModel}">
    <Grid>
        <Grid.Resources>
            <CollectionViewSource x:Key="items"
                                  Source="{Binding}">
                <CollectionViewSource.SortDescriptions>
                    <scm:SortDescription PropertyName="AssetType.AssetCategory.Name" />
                    <scm:SortDescription PropertyName="AssetType.Name" />
                    <scm:SortDescription PropertyName="Manufacturer.Name" />
                </CollectionViewSource.SortDescriptions>
            </CollectionViewSource>
        </Grid.Resources>

        <ListView ItemsSource="{Binding Source={StaticResource items}}">

        </ListView>
    </Grid>
</DataTemplate>
于 2011-07-07T17:37:48.637 に答える
0

データ テンプレートをユーザー コントロールに移動することで、この問題を回避しました。

于 2011-01-07T17:15:39.000 に答える
-1

のビューにバインドする必要があると思いますCollectionViewSource:

<ListBox ItemsSource="{Binding Path=View, Source={StaticResource CVS}}">
于 2010-10-14T08:28:20.643 に答える