2011-12-30 102 views
9

我正在使用DataGrid顯示幾個字段,其中之一是多行描述。網格顯示數據就好了,直到我試圖通過設置HeadersVisibility="Column"隱藏標題行。標題行消失,但是當我滾動時,行標題重新出現在一些隨機行中。WPF DataGrid行標題可見性錯誤

我已經縮小到顯示多行描述的列。只要我離開這個專欄,那麼我就沒有這個問題。我曾嘗試通過"\r\n""\n"兩者來分隔線條,但都無效。 DataGrid是否支持多行文本字段?

下面是一張圖片,顯示正在發生的事情以及我用來創建網格的XAML。

DataGrid Row Header Error Image

<DataGrid DataContext="{StaticResource personRepository}" 
      ItemsSource="{Binding PersonList, Mode=OneWay}" 
      AutoGenerateColumns="False" 
      HeadersVisibility="Column" 
      CanUserSortColumns="False" 
      SelectionMode="Extended" 
      IsReadOnly="True"> 

    <DataGrid.Columns> 
     <DataGridTextColumn Header="Id" Width="80" Binding="{Binding Id, Mode=OneWay}" /> 
     <DataGridTextColumn Header="First Name" Width="150" Binding="{Binding FirstName, Mode=OneWay}" /> 
     <DataGridTextColumn Header="Last Name" Width="150" Binding="{Binding LastName, Mode=OneWay}" /> 
     <DataGridTextColumn Header="Description" Width="*" Binding="{Binding Description, Mode=OneWay}" /> 
    </DataGrid.Columns> 
</DataGrid> 
+0

你是什麼意思是「隱藏的標題行「? HeadersVisibility =「列」是默認值。之前的設置(工作)是什麼?如果這是隻讀,我會使用ListView GridView。更多的XAML,但我認爲你有更好的格式控制。對於內容使用TextBlock並將Wrap設置爲描述。 – Paparazzi 2011-12-30 20:57:34

+0

默認爲HeadersVisibility = All。標題行很小,但它在那裏。我開始使用GridView,但列寬將不會接受「*」符號,因此最後一列將填充剩餘空間。 – dewald 2011-12-30 21:08:25

+0

您必須爲GridView使用*轉換器。如果您願意,我會將其作爲答案發布。 – Paparazzi 2011-12-30 21:36:34

回答

16

嘗試設置的RowHeaderWidth = 0代替HeaderVisibility

1

在這種情況下lvCurDocFields是父的ListView。這裏的缺點是你需要爲其他列設置硬寬度,然後這些其他列的總數是ConverterParameter。如果你有一個垂直滾動條,然後離開約20 GridView控件是一種痛苦,但我喜歡的演講爲只讀它要比DataGrid中更有效

<GridViewColumn Width="{Binding ElementName=lvCurDocFields, Path=ActualWidth, Converter={StaticResource widthConverter}, ConverterParameter=100}"> 

[ValueConversion(typeof(double), typeof(double))] 
public class WidthConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // value is the total width available 
     double otherWidth; 
     try 
     { 
      otherWidth = System.Convert.ToDouble(parameter); 
     } 
     catch 
     { 
      otherWidth = 100; 
     } 
     if (otherWidth < 0) otherWidth = 0; 

     double width = (double)value - otherWidth; 
     if (width < 0) width = 0; 
     return width; // columnsCount; 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
}