2010-05-27 8 views
0

A ListView avec datatemplate dans GridViewColumn:WPF: Comment définir la largeur de colonne avec remplissage automatique en ListView avec un contrôle utilisateur personnalisé

<ListView Name ="LogDataList" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding LogDataCollection}" Background="Cyan"> 
      <ListView.View> 
       <GridView AllowsColumnReorder="true" 
        ColumnHeaderToolTip="Event Log Information"> 
        <GridViewColumn Header="Event Log Name" Width="100"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <l:MyTextBlock Height="25" DataContext="{Binding LogName, Converter={StaticResource DataFieldConverter}}" HighlightMatchCase="{Binding Element}" Loaded="EditBox_Loaded"/> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
         ... 
        </GridView> 
      </ListView.View> 
     </ListView> 

Je ne sais pas sur la façon de faire la largeur colonne autofill bien que je l'ai essayé beaucoup de manière à marcher. L'idée générale de démonstration est:

<ListView Name ="LogDataList" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding LogDataCollection}" Background="Cyan"> 
      <ListView.Resources> 
       <Style x:Key="ColumnWidthStyle" TargetType="{x:Type GridViewColumn}"> 
        <Style.Setters> 
         <Setter Property="HorizontalContentAlignment" Value="Stretch" > 
         </Setter> 
        </Style.Setters> 
       </Style> 
      </ListView.Resources> 
      <ListView.View> 
       <GridView AllowsColumnReorder="true" 
        ColumnHeaderToolTip="Event Log Information"> 
        <GridViewColumn Header="Event Log Name" DisplayMemberBinding="{Binding Path=LogName}" HeaderContainerStyle="{StaticResource ColumnWidthStyle}"> 

Il fonctionne, mais pas accord avec ma demande. J'ai besoin de personnaliser le datatemplate avec mon contrôle utilisateur personnalisé (MyTextBlock) depuis l'amélioration (propriété HighlighMatchCase) et le datacontext de liaison.

Comment puis-je configurer ColumnWidthMode avec Remplir le mot? En ligne.

J'apprécie vraiment votre aide.

Répondre

0

Ceci est un travail pour moi. Tout d'abord, ajoutez la propriété Text à MyTextBlock car elle n'est pas héritée de System.Windows.Controls.TextBlock mais de User Control.

public object Text 
     { 
      get { return GetValue(TextProperty); } 
      set 
      { 
       SetValue(TextProperty, value); 
      } 
     } 

     public static readonly DependencyProperty TextProperty = 
      DependencyProperty.Register(
     "Text", 
     typeof(object), 
     typeof(MyTextBlock), 
        new PropertyMetadata(null, new PropertyChangedCallback(TextChangedCallback))); 

     static void TextChangedCallback(DependencyObject property, 
DependencyPropertyChangedEventArgs args) 
     { 
      MyTextBlock textBox = (MyTextBlock)property; 
      textBox.textBlock.Text = args.NewValue.ToString(); 
     } 

Ensuite, redimensionner manuellement la largeur des colonnes comme ceci:

private void ResizeColumnWidth() 
     { 
      foreach (GridViewColumn column in LogGridView.Columns) 
      { 
       column.Width = column.ActualWidth; 
       column.Width = double.NaN; 
      } 
     }