2012-07-17 51 views
0

來自動調整ListView中/ GridView的列我有以下附加屬性: -無法使用附加屬性

public partial class GridViewProperties 
{ 

    public static readonly DependencyProperty DoAutoSizeColumnsProperty = 
       DependencyProperty.RegisterAttached("DoAutoSizeColumns", 
       typeof(bool), 
       typeof(GridViewProperties), 
       new FrameworkPropertyMetadata(false, 
               FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | 
               FrameworkPropertyMetadataOptions.AffectsMeasure | 
               FrameworkPropertyMetadataOptions.AffectsArrange | 
               FrameworkPropertyMetadataOptions.AffectsParentArrange | 
               FrameworkPropertyMetadataOptions.AffectsParentMeasure | 
               FrameworkPropertyMetadataOptions.AffectsRender, 
               DoAutoSizeColumnsChanged)); 

    public static bool GetDoAutoSizeColumns(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(DoAutoSizeColumnsProperty); 
    } 

    public static void SetDoAutoSizeColumns(DependencyObject obj, bool value) 
    { 
     obj.SetValue(DoAutoSizeColumnsProperty, value); 
    } 

    private static void DoAutoSizeColumnsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     var gv = obj as GridView; 

     if (gv == null) 
      return; 

     if (e.NewValue != null && (bool)e.NewValue) 
     { 
      AutoSizeColumns(gv.Columns); 
      SetDoAutoSizeColumns(gv, false); 
      gv.InvalidateProperty(GridView.ColumnCollectionProperty); 
     } 
    } 
    private static void AutoSizeColumns(GridViewColumnCollection gvcc) 
    { 

     // same code as double clicking column gripper 
     foreach (var gvc in gvcc) 
     { 
      // if already set to auto, toggle it so that we can re-run width="auto" 
      //if (double.IsNaN(gvc.Width)) 
      gvc.Width = gvc.ActualWidth; 
      // now do it     
      gvc.Width = double.NaN; 
      //gvc.InvalidateProperty(GridViewColumn.WidthProperty); 
      //gvc.ClearValue(GridViewColumn.WidthProperty); 
     } 
    } 
} 

我用它在XAML以下列方式:

<Style x:Key="AutoColumnStyle" TargetType="ListView"> 
     <Setter Property="View"> 
      <Setter.Value> 
       <GridView infra:GridViewProperties.AutoSizeColumns="{Binding Path=DataContext.DoAutoSizeColumns, Source={x:Reference uc}}"> 
        <GridViewColumn Width="auto" Header="Title" CellTemplate="{StaticResource Name}" /> 
        <GridViewColumn Width="auto" Header="First" CellTemplate="{StaticResource First}"/>       
        <GridViewColumn Width="auto" Header="Last" CellTemplate="{StaticResource Last}"/>       
       </GridView> 
      </Setter.Value> 
     </Setter> 

abaove位於UserControl.Resources中。

的XAML的其餘部分是:

<ListView ItemsSource="{Binding Names}" VerticalAlignment="Top" HorizontalAlignment="Left" 
       ScrollViewer.VerticalScrollBarVisibility="Auto" 
       ScrollViewer.HorizontalScrollBarVisibility="Auto" 
       SelectionMode="Single" 
       x:Name="ListViewContracts" 
       KeyboardNavigation.TabNavigation="Continue" 
       KeyboardNavigation.DirectionalNavigation="Cycle" 
       Style="{StaticResource AutoColumnStyle}" 
      > 
    <ListView.ItemContainerStyle > 
     <Style BasedOn="{StaticResource ListViewItemContainerStyle}" TargetType="ListViewItem">     
      <Setter Property="Focusable" Value="False" /> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
     </Style>     
    </ListView.ItemContainerStyle> 
</ListView> 

(我沒有WIDTH = 「自動」 也嘗試過這一點)。

每當我在我的ViewModel中設置DoAutoSizeColumns = true時,我發現所有的東西都在按照預期在附加屬性中工作,除非它被設置爲gridview列沒有根據該列中最大的項目調整大小(儘管我看到gv.Width從雙精度切換到雙精度。這是調整大小的工作原理)。

正如您所看到的,我已經嘗試了附加屬性中的大量變體,主要包括添加所有FrameworkPoprertyMetadataOptions並嘗試各種InvalidatePoperty嘗試,還嘗試了UIPropertyMetadata(也包括DynamicResource)。

我錯過了什麼?

UPDATE

這種附加屬性在其他GridView的工作我可以在這裏看到的唯一的區別是 - 我需要切換GridView的,只是不上面所指出的 - 但是關鍵的區別ListView控件是我注入作爲一種風格而不是直接。 (其次,這可能不是這種情況,因爲這些其他GridView中的列中的第一項始終是最大的項目)。

+0

我有一個答案,但不能再發布4個小時 – 2012-07-17 14:24:52

回答

0

這是爲了注入風格。

我有兩個不同的GridView由一個布爾值切換,並使用DataTrigger注入備用的和AutoSizeColumns在那個更改的GridView上工作正常!所以我讓這兩種樣式都通過DataTrigger注入,而不像上面的XAML那樣僅由setter設置默認值。

至於爲什麼這是我的情況,我會感興趣的發現。至少我有一種完全MVVM的方式來自動化列,這是我在其他SO答案中沒有看到的。

(順便說一下,我有其他附加的屬性,不需要我手動觸發autosize,我只是寫了這個版本,以確定問題)。