我正在WPF中构建一个应用程序,该应用程序在项控件内使用ItemsControl来创建带有可变数字列的网格,在设计时尚不知道。很好。
现在我要变成模板/样式,我想做的一件事就是使用依赖项属性设置列宽。在某种意义上说,这是成功的,因为默认值是在模板中选择并使用的,但是不使用items控件中设置的值,并且永远不会调用getter和setter
模板
<Style TargetType="{x:Type ItemsControl}" x:Key="DocColumnHeaderPanel">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="0,1,1,1" Width="{Binding Path=(local:DocColumn.DocColumnWidth), RelativeSource={RelativeSource TemplatedParent}}" >
<Grid>
<Grid.LayoutTransform>
<RotateTransform Angle="90" />
</Grid.LayoutTransform>
<TextBlock Padding="5" TextWrapping="WrapWithOverflow" Width="140" Height="{Binding Path=(local:DocColumn.DocColumnWidth), RelativeSource={RelativeSource TemplatedParent}}" Text="{Binding Name}" ToolTip="{Binding Name}" HorizontalAlignment="Left" />
<Button Content=">" Command="{Binding DocumentSortCommand}" CommandParameter="{Binding Index}" HorizontalAlignment="Right" />
</Grid>
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
依赖对象
public class DocColumn : DependencyObject
{
public static readonly DependencyProperty DocColumnWidthProperty
= DependencyProperty.RegisterAttached("DocColumnWidth", typeof(float), typeof(DocColumn), new FrameworkPropertyMetadata(20f,FrameworkPropertyMetadataOptions.AffectsArrange | FrameworkPropertyMetadataOptions.AffectsMeasure ));
public static void SetDocColumnWidth(UIElement target, float value)
{
Debug.WriteLine("Setting DocColumnWidth");
target.SetValue(DocColumnWidthProperty, value);
}
public static float GetDocColumnWidth(UIElement target)
{
Debug.WriteLine("Getting DocColumnWidth");
return (float)target.GetValue(DocColumnWidthProperty);
}
}
和使用样式的ItemsControl
<ItemsControl ItemsSource="{Binding Documents}" Margin="0,-4,0,4" Style="{StaticResource ResourceKey=DocColumnHeaderPanel}" local:DocColumn.DocColumnWidth="50" >
最初,我尝试使用TemplateBinding,但没有任何用处,当我将其更改为Binding时,列宽受到影响,但仅遵循DocColumnWidth注册中的默认值。
getter和setter都没有被调用过。
非常感谢任何帮助