我有以下附属财产: -
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 =“auto”)。
每当我在ViewModel中设置DoAutoSizeColumns = true时,我看到附加属性中的所有内容都按预期工作,除了它被设计的内容是gridview列没有根据该列中的最大项进行调整(即使我看到gv .Width从和切换为double.Nan是调整大小的方式。)
正如您所看到的,我已经尝试了附加属性中的许多变体,主要是注释掉包括添加所有FrameworkPoprertyMetadataOptions并尝试各种InvalidatePoperty尝试以及UIPropertyMetadata(以及DynamicResource)。
我错过了什么?
更新
这个附加属性在其他GridView中工作,我在这里看到的唯一区别是 - 我需要在ListView中切换GridViews,而上面没有指出 - 但关键的区别在于我注入的是样式而不是直接注入。 (第二个想法可能不是这种情况,因为这些其他GridViews中列中的第一项始终是最大的项目。)
答案 0 :(得分:0)
这与注射风格有关。
我有两个不同的GridViews由一个布尔值切换,并使用DataTrigger注入备用的一个,AutoSizeColumns在这个更改的GridView上正常工作!所以我让两个样式都由DataTrigger注入,而不是像上面的XAML那样只使用setter来设置默认值。
至于为什么会这样,我会有兴趣找到答案。至少我有一个完全MVVM方式的自动调整列,这是我在其他SO答案中没有看到的。
(顺便说一下,我有其他附加属性,不需要我手动触发自动调整大小,我只是写了这个版本来识别问题)。