2013-05-17 4 views
3

DataGrid의 열은 내가 만든 간단한 데이터 개체의 유형 인 ObservableCollection으로 설정됩니다. 첫 번째 열의 너비는 "자동"으로 설정되고 두 번째 열은 너비가 "1 *"으로 설정됩니다.WPF Datagrid 열 너비 문제

ItemsSource 변경시 "자동"으로 설정된 내 열의 너비를 자동 업데이트하려면 here 응답 방법을 사용하고 있습니다. 이것은 대부분의 시간을 작동하는 것 같다 :이 훌륭 및 모든 시간을 작동

enter image description here ItemsSource 조금 큰 경우 (약 30 ~ 35 기록을 말할 수),하지만

상기 "자동"폭 (첫번째) 열에 다운 감소 할 (스크롤바 포함)가 DataGrid는 클릭이다 :

을 이 클릭되지 않은 경우이 제대로 조정됩니다

내 XAML은 다음과 같습니다 : 코드는 컬럼의 갱신을 보장하기

<my:DataGrid CanUserSortColumns="false" CanUserResizeRows="false" CanUserResizeColumns="false" CanUserReorderColumns="false" CanUserDeleteRows="false" CanUserAddRows="false" AutoGenerateColumns ="False" SelectionMode="Single" SelectionUnit="Cell" Height="113" HorizontalAlignment="Left" Margin="11,22,0,0" Name="dataGrid" VerticalAlignment="Top" Width="226" Background="#FFE2E2E2" AlternatingRowBackground="#FFA4CFF2" BorderBrush="#FF7C7C7C" HorizontalGridLinesBrush="White" PreviewKeyDown="dataGrid_PreviewKeyDown" CellEditEnding="dataGrid_CellEditEnding" BeginningEdit="dataGrid_BeginningEdit" PreparingCellForEdit="dataGrid_PreparingCellForEdit" SelectedCellsChanged="dataGrid_SelectedCellsChanged" Loaded="dataGrid_Loaded" TargetUpdated="dataGrid_TargetUpdated"> 
     <my:DataGrid.Columns> 
     <my:DataGridTextColumn Binding="{Binding Path=Name, NotifyOnTargetUpdated=True}" Width="Auto"> 
       <my:DataGridTextColumn.CellStyle> 
        <Style TargetType="{x:Type my:DataGridCell}"> 
         <Setter Property="KeyboardNavigation.IsTabStop" Value="False"></Setter> 
         <Setter Property="IsHitTestVisible" Value="False"></Setter> 
         <Setter Property="Focusable" Value="False"></Setter> 
         <Setter Property="Background" Value="WhiteSmoke"></Setter> 
         <Setter Property="BorderBrush" Value="LightGray"></Setter> 
        </Style> 
       </my:DataGridTextColumn.CellStyle> 
       </my:DataGridTextColumn> 
     <my:DataGridTextColumn Binding="{Binding Path=Value}" Width="1*"></my:DataGridTextColumn> 
    </my:DataGrid.Columns> 
</my:DataGrid> 

가 :

private void dataGrid_TargetUpdated(object sender, DataTransferEventArgs e) 
    { 
     dataGrid.Columns[0].Width = 0; 
     dataGrid.UpdateLayout(); 
     dataGrid.Columns[0].Width = new DataGridLength(0, DataGridLengthUnitType.Auto); 
     dataGrid.UpdateLayout(); 
    } 

인가 목록이 더 길 때만 이런 일이 일어날 수 있습니다.

답변

1

DataGrid의 TargetUpdated은 몇 가지 시나리오에서 호출되지 않을 수 있습니다. 예를 들어 더 많은 행이 들어 왔지만 표시되지 않는 경우 DataGrid는 표시되지 않는 무언가를 다시 낭비 할 필요가 없습니다. 최초의 TargetUpdated은 괜찮지 만 추가 후크를 찾아 ItemsSourcedatagrid에 바인딩 된 객체의 CollectionChanged에 연결하는 것과 같이 observableCollectionCollectionChanged 이벤트가 있고 가입하고 시도해보십시오 거기에 논리.