2010-05-27 61 views
0

用的DataTemplate一個ListView在GridViewColumn設定自動填充柱寬度的ListView:WPF:如何使用自定義用戶控件

<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> 

我不知道如何使列寬自動填充的想法,雖然我已經嘗試了很多走路的方式。 用於演示的總體思路是:

<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}"> 

它的工作原理,但不符合我的需求一致。我需要自定義的DataTemplate與我的自定義用戶控件(MyTextBlock),因爲增強(HighlighMatchCase屬性)和綁定的DataContext。

我如何建立與字填充ColumnWidthMode?上line'in。

我真的很感謝你的幫助。

回答

0

這是爲我工作。首先,Text屬性添加到MyTextBlock,因爲它沒有從System.Windows.Controls.TextBlock但用戶控件繼承。

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(); 
     } 

然後,手動調整列寬是這樣的:

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