0

私は次の添付プロパティを持っています:-

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>

上記は 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="auto" なしで試しました)。

ViewModel で DoAutoSizeColumns = true を設定するたびに、gridview 列がその列の最大の項目に応じてサイズ変更されないことを除いて、すべてが添付プロパティで期待どおりに機能することがわかりますfrom および to double.Nan は、サイズ変更が機能する方法です)。

ご覧のとおり、すべての FrameworkPoprertyMetadataOptions を追加し、さまざまな InvalidatePoperty の試行だけでなく、UIPropertyMetadata (および DynamicResource も) を試すなど、ほとんどがコメント アウトされている添付プロパティでさまざまなバリエーションを試しました。

私は何が欠けていますか?

アップデート

この添付プロパティは他の GridView で機能します。ここで確認できる唯一の違いは、上に示していない ListView で GridView を切り替える必要があることですが、主な違いは、直接ではなくスタイルとして挿入することです。(これらの他の GridViews の列の最初の項目は常に最大の項目であるため、これは当てはまらないかもしれません)。

4

1 に答える 1

0

それはスタイルの注入と関係がありました。

2つの異なるGridViewをブール値で切り替え、DataTriggerを使用して代替のGridViewを挿入し、AutoSizeColumnsがその代替のGridViewで正常に機能しました。そのため、上記のXAMLのように、デフォルトをセッターだけで設定するのではなく、両方のスタイルをDataTriggerで注入するようにしました。

なぜそうなるのかについては、私が知りたいと思います。少なくとも、他のSOの回答では見られなかった、列の自動サイズ設定の完全なMVVMの方法があります。

(ところで、自動サイズ設定を手動でトリガーする必要のない他の添付プロパティがあります。問題を特定するためにこのバージョンを作成しました)。

于 2012-07-18T09:30:36.270 に答える