5

ItemsSourceにバインドするデータグリッドがありCollectionViewSourceます。
各列Pathでバインディングのプロパティを指定して、表示する特定の情報を取得します。

私がやりたいことは、ユーザーがより多くの情報を必要とする場合に、いくつかの列をチェックボックスで切り替えることです。これを行うには、表示プロパティをチェックボックスの値に (コンバーターを使用して) バインドする必要がありますが、列のデータ コンテキストがバインドに干渉していることは確かです。

<DataGrid ItemsSource="{Binding Source={StaticResource cvs}}" ....>
    <DataGrid.Columns>
        <DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"
            Visibility="{Binding IsChecked,
                                 ElementName=IncludeFullHist, 
                                 Converter={StaticResource boolItemsConverter}}"/>   
    </DataGrid.Columns>
</DataGrid>

ビューモデルにもチェックボックスが必要なので、そのIsCheckedプロパティをビューモデルのプロパティにバインドします

<CheckBox x:Name="IncludeFullHist"  IsChecked="{Binding Path=ManagerFullHist }" />

私のページの他の要素については、次の 2 つの方法のいずれかを使用して可視性バインディングを接続できましたが、それらをデータグリッドにコピーすると、どちらも機能しないようです。

<TextBlock DockPanel.Dock="Left" Text=" Visible 2 " 
    Visibility="{Binding Path=DataContext.ManagerFullHist,
                         RelativeSource={RelativeSource FindAncestor,
                         AncestorType={x:Type UserControl}},
                         Converter={StaticResource boolItemsConverter}}"/>
<TextBlock DockPanel.Dock="Left" Text=" Visible 3 " 
    Visibility="{Binding Path=ManagerFullHist, 
                         Source={StaticResource mainWinResource},
                         Converter={StaticResource boolItemsConverter}}"/>

データグリッドでこれを解決する方法について何か提案はありますか?
役立つ可能性のあるコードを省略した場合はお知らせください。

4

1 に答える 1

11

DataGridColumn実際には の一部ではないVisualTreeため、クラスのバインディングはそのソースを見つけることができません

VisibilityandWidthプロパティのようなものを または のCellStyleまたはHeaderStyleに設定できますがDataGridColumn、まったく同じではありません。

私が見つけた解決策に最も近いのは、バインディングを格納するFreezableオブジェクトを作成し、それをバインディングで使用することです。これはきれいな解決策ではありませんが、現時点で私が見つけることができる唯一の解決策です。<DataGrid.Resources>StaticResourceVisibility

ここでその例を見ることができます

<DataGrid.Resources>
    <local:BindingProxy x:Key="proxy" Data="{Binding IsChecked, 
         ElementName=IncludeFullHist, 
         Converter={StaticResource boolItemsConverter}}" />
</DataGrid.Resources>

<DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"
    Visibility="{Binding Path=Data, Source={StaticResource proxy}}"/>  
于 2012-08-27T16:38:03.647 に答える