3

View に GridView と多数の列定義が含まれる ListView があります。以下のように:

<ListView Name="SampleListView" ItemsSource="{Binding SomeSource}" >
        <ListView.View>
            <GridView AllowsColumnReorder="False">
                <GridViewColumn Header="{Binding ColumnHeader1,Mode=OneWay}" CellTemplate="{StaticResource Column1Template}" />
                <GridViewColumn Header="{Binding ColumnHeader2,Mode=OneWay}" CellTemplate="{StaticResource Column2Template}" />
                <GridViewColumn Header="{Binding ColumnHeader3,Mode=OneWay}" CellTemplate="{StaticResource Column3Template}" />
                <GridViewColumn Header="{Binding ColumnHeader4,Mode=OneWay}" CellTemplate="{StaticResource Column4Template}" />
                <GridViewColumn Header="{Binding ColumnHeader5,Mode=OneWay}" CellTemplate="{StaticResource Column5Template}" />
            </GridView>
        </ListView.View>
    </ListView>

(これは完全に機能します)

ユーザー設定の最初の列を非表示にする必要があるため、これを実現するためにスタイル トリガーを作成しました。スタイルトリガーを使用したコードは次のとおりです

<ListView Name="SampleListView" ItemsSource="{Binding SomeSource}" >
        <ListView.Resources>
            <Style x:Key="{x:Type ListView}" TargetType="ListView">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Source={x:Static p:User.Default},Path=ShowColumn1,Mode=OneWay}" Value="False">
                        <Setter Property="View">
                            <Setter.Value>
                                <GridView x:Name="WithOutColumn1" AllowsColumnReorder="False">
                                        <GridViewColumn Header="{Binding ColumnHeader2,Mode=OneWay}" CellTemplate="{StaticResource Column2Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader3,Mode=OneWay}" CellTemplate="{StaticResource Column3Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader4,Mode=OneWay}" CellTemplate="{StaticResource Column4Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader5,Mode=OneWay}" CellTemplate="{StaticResource Column5Template}" />
                                    </GridView>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Source={x:Static p:User.Default},Path=ShowColumn1,Mode=OneWay}" Value="True">
                        <Setter Property="View">
                            <Setter.Value>
                                <GridView x:Name="WithColumn1"  AllowsColumnReorder="False">
                                        <GridViewColumn Header="{Binding ColumnHeader1,Mode=OneWay}" CellTemplate="{StaticResource Column1Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader2,Mode=OneWay}" CellTemplate="{StaticResource Column2Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader3,Mode=OneWay}" CellTemplate="{StaticResource Column3Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader4,Mode=OneWay}" CellTemplate="{StaticResource Column4Template}" />
                                        <GridViewColumn Header="{Binding ColumnHeader5,Mode=OneWay}" CellTemplate="{StaticResource Column5Template}" />
                                </GridView>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ListView.Resources>
    </ListView>

このスタイルを使用すると、GridViewColumn ヘッダー プロパティのバインディングが機能しません。

ただし、CellTemplate の Binding は正しく表示されます。

VS の出力ウィンドウにこのエラーが表示される

System.Windows.Data エラー: 2: ターゲット要素の管理 FrameworkElement または FrameworkContentElement が見つかりません。BindingExpression:Path=ColumnHeader1; DataItem=null; ターゲット要素は 'GridViewColumn' (HashCode=56585823) です。ターゲット プロパティは 'Header' (タイプ 'Object

これが発生する理由と解決方法について、誰かが光を当てることができますか?

試したこと:

  • RelativePath バインディングを使用して、DataContext が有効であることを確認します。(GridViewColumn 定義がこの投稿のビジュアル ツリーの外側に存在すると思われるため、これが機能しないと思われます。ここ)

  • HeaderTemplate の DataTemplate の作成: 同じ結果です。

  • この投稿に従って FrameWorkElement をプロキシとして使用する

4

1 に答える 1