为什么我的依赖项属性设置/不起作用

时间:2019-04-10 19:57:43

标签: wpf templates dependencyobject

我正在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都没有被调用过。

非常感谢任何帮助

0 个答案:

没有答案