2011-06-17 8 views
1

これは大したことではありませんが、私はWPFについてさらに学びたいと思います。次の問題を処理する方法はあまり冗長ではないかと思います。ソースオブジェクトwndStateのブール型プロパティShowAdvancedContentに基づいて、データグリッドの列を表示および非表示にするXAMLコードを設定しました(下の抜粋)。データグリッド自体はデータソースにバインドされており、wndStateのオブジェクトではないため、Source属性を指定しています.BoolからVisibilityに変換しているので、Converter属性を指定しています。この繰り返しのWPFバインディングを宣言するために、より良い方法と少ない方法がありますか?

<locset:WindowState x:Key="wndState" /> 
<locdata:BooleanToVisibilityConverter x:Key="BoolToCollapsedConverter" 
             True="Visible" False="Collapsed" /> 

... 

<DataGridHyperlinkColumn x:Name="urlColumn" Binding="{Binding Path=Url}" 
      Header="{DynamicResource ResourceKey=urlColHdr}" 
      MinWidth="100" Width="*" 
      Visibility="{Binding Source={StaticResource wndState}, Path=ShowAdvancedContent, Converter={StaticResource ResourceKey=BoolToCollapsedConverter}, Mode=OneWay}"> 
    <DataGridHyperlinkColumn.ElementStyle> 
     <Style TargetType="TextBlock"> 
      <EventSetter Event="Hyperlink.Click" Handler="OnHyperlinkClick" /> 
     </Style> 
    </DataGridHyperlinkColumn.ElementStyle> 
</DataGridHyperlinkColumn> 

<DataGridTextColumn x:Name="addressColumn" Binding="{Binding Path=Address}" 
     Header="{DynamicResource ResourceKey=addressColHdr}" 
     MinWidth="120" Width="SizeToCells" 
     Visibility="{Binding Source={StaticResource wndState}, Path=ShowAdvancedContent, Converter={StaticResource ResourceKey=BoolToCollapsedConverter}, Mode=OneWay}" /> 

<DataGridTextColumn x:Name="portColumn" Binding="{Binding Path=Port}" 
     Header="{DynamicResource ResourceKey=portColHdr}" 
     MinWidth="80" Width="SizeToCells" 
     Visibility="{Binding Source={StaticResource wndState}, Path=ShowAdvancedContent, Converter={StaticResource ResourceKey=BoolToCollapsedConverter}, Mode=OneWay}" /> 

<DataGridTextColumn x:Name="protocolVersionColumn" Binding="{Binding Path=ProtocolVersion}" 
     Header="{DynamicResource ResourceKey=protocolColHdr}" 
     Width="SizeToHeader" 
     Visibility="{Binding Source={StaticResource wndState}, Path=ShowAdvancedContent, Converter={StaticResource ResourceKey=BoolToCollapsedConverter}, Mode=OneWay}"/> 

このアプローチは、ShowAdvancedContentの値を切り替えると、列が崩壊して表示されるようになります。しかし、私はこの正確な文字列を4回繰り返しています:私は「ShowAdvancedContent」に「AdvancedColVisibility」からプロパティの名前を変更したときに

Visibility="{Binding Source={StaticResource wndState}, 
        Path=ShowAdvancedContent, 
        Converter={StaticResource ResourceKey=BoolToCollapsedConverter}, 
        Mode=OneWay}" /> 

は、だから、今日私は、4つの場所でそれを変更しなければなりませんでした。 (上記のように、大したことではなく、私はWPFについて学ぶために、この特定のコードブロックを管理するよりも多くのことを求めています)。

バインディングを宣言する方法はありますか?例えば、いくつかのタイプのバインディングリソースやSyleリソースを経由して、4つの列のそれぞれについて宣言しますか?

答えて

0

スタイルを作成して列に適用します。どこかのリソースで

、スタイルを作成します。

<Style 
    x:Key="AdvancedColumn" 
    TargetType="DataGridColumn"> 
    <Setter 
     Property="Visibility" 
     Value="{Binding ShowAdvancedContent, 
         Source={StaticResource wndState}, 
         Converter={StaticResource BoolToCollapsedConverter}, 
         Mode=OneWay}" /> 
</Style> 

次に、あなたの列に適用します:

<DataGridTextColumn 
    x:Name="addressColumn" 
    Binding="{Binding Path=Address}" 
    Header="{DynamicResource ResourceKey=addressColHdr}" 
    MinWidth="120" 
    Width="SizeToCells" 
    Style="{StaticResource AdvancedColumn}"/> 

注意、これはWPFのようなpseudoxamlで、テストはしていません。

+0

これは私が望んでいた_sort_アプローチですが、DataGridColumnとその子孫にはStyleプロパティがありません。 (DataGridColumnはFrameworkElementまたはFrameworkContentElementのいずれからも継承しません)。 – dgvid

+0

@dgvid:Yowch ...ターゲットタイプをDataGridCellに変更し、DataGridColumn.CellStyleを使用してスタイルを設定し、*セルの* Widthを0に設定するとどうなりますか? HeaderStyleも同様に行う必要があります。ハックのビットですが、うまくいくかもしれません... – Will

+0

@dgvid:*はDependencyObjectです。バインディングに応答して列を折りたたむSilverlightの "動作"を作成することができます。私はこれもややハックだと考えています。これは、添付されたプロパティが必要なので、静的です。弱い参照としてそれらを管理するインスタンスですべての参照をラップする必要があります。 – Will

関連する問題