2017-03-20 5 views
1

私はlistviewgridviewを持っています。私はgridviewの私の列の列ヘッダーを空にする必要がありますが、他の列はヘッダーを持っています。しかし、GridViewColumnheader=""を設定すると、その列の幅が空の列のヘッダーの幅に収まるように縮小され、列が見えなくなります。私は列のwidth="auto"をテストしましたが、動作しません。この列を強制的にセルの幅に合わせて幅を設定するにはどうしたらいいですか?そのヘッダが空でなければならないグリッドビューの列の幅が列の内容に適合しません

カラム:

<GridViewColumn> 
    <GridViewColumn.Header> 
     <GridViewColumnHeader Padding="2,2,2,0" VerticalContentAlignment="Bottom" ClickMode="Press" /> 
     </GridViewColumn.Header> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Converter={StaticResource IndexConverter}}" FontWeight="Bold" /> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

コンバータ:

public class IndexConverter : IValueConverter 
{ 
    public object Convert(object value, Type TargetType, object parameter, CultureInfo culture) 
    { 
     ListViewItem item = (ListViewItem)value; 
     ListView listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView; 
     int index = listView.ItemContainerGenerator.IndexFromContainer(item) + 1; 
     return index.ToString(); 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return new object(); } 
} 

おかげ

+0

ここにいくつかのXAMLを追加します。 –

+0

'のような単純な例では、列の内容の幅は自動的に!また、 'width =" auto "'がセットされているか 'Header =" "'。簡単な例から始めるか、コードを提供するのがよいでしょう! – WPFGermany

答えて

0

それは列がレンダリング後に、その内容をロードすることは、問題です。その後、列の最初の自動幅は再び計算されません。だからあなたのグリッドがヘッダーをロードし、セル内容が空のとき。次に、最初の幅はゼロに計算されます。

バインディングにFallbackValueを定義することで、この問題を解決する簡単な方法があります。今すぐあなたのColumnWidthが最初123の幅に拡大され

<GridViewColumn> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Converter={StaticResource IndexConverter}, FallbackValue='123'}" FontWeight="Bold" /> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

0

この列の幅は、セルの幅ではなくセルの幅に応じて設定できますか?

TextBlockの幅は、バインディングが解決されてから列が既にレンダリングされるまでわかりません。

この問題を回避するには、TextBlockLoadedイベントを処理し、列のWidthを明示的に設定する必要があります。あなたはTagプロパティを使用してサイズを変更する列のインデックスを指定することができます。

private void TextBlock_Loaded(object sender, RoutedEventArgs e) 
{ 
    TextBlock tb = sender as TextBlock; 
    int index; 
    if (tb != null && tb.Tag != null && int.TryParse(tb.Tag.ToString(), out index) && gv.Columns.Count > index) 
    { 
     gv.Columns[index].Width = tb.ActualWidth + 12; 
    } 
} 

<ListView x:Name="lv"> 
    <ListView.Resources> 
     <local:IndexConverter x:Key="IndexConverter" /> 
    </ListView.Resources> 
    <ListView.View> 
     <GridView x:Name="gv"> 
      <GridView.Columns> 
       <GridViewColumn> 
        <GridViewColumn.Header> 
         <GridViewColumnHeader Padding="2,2,2,0" VerticalContentAlignment="Bottom" ClickMode="Press" /> 
        </GridViewColumn.Header> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, 
             Converter={StaticResource IndexConverter}}" FontWeight="Bold" Tag="0" Loaded="TextBlock_Loaded" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView.Columns> 
     </GridView> 
    </ListView.View> 
</ListView> 
関連する問題