子进程不继承依赖属性值并采用默认值

时间:2015-05-05 19:56:51

标签: c# wpf

我有一个依赖属性,它应该从附加属性继承它的值,但它永远不会。它似乎总是取其默认值。

我的设置

我有一个继承自Microsoft的DataGrid的自定义网格和一个继承自Microsoft的DataGridTextColumn的CustomColumn。

我的CustomGrid有一个可继承的附加属性" ShowToolTip"使用继承标志,我的CustomColumn有一个" ShowToolTip"依赖属性。

CustomColumn" ShowToolTip"永远不会将我在CustomGrid中设置的值设置为ShowToolTip。

CustomGrid附加属性:

public class CustomGrid: DataGrid
{
        static CustomGrid()
        {
             ShowToolTipProperty = DependencyProperty.RegisterAttached("ShowToolTip", typeof(bool), typeof(CustomGrid), 
                new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits));

        }

        public static bool GetShowToolTip(DependencyObject target)
        {
            return (bool)target.GetValue(ShowToolTipProperty);
        }

        public static void SetShowToolTip(DependencyObject target, bool value)
        {
            target.SetValue(ShowToolTipProperty, value);
        }

        public bool ShowToolTip
        {
            get
            {
                return GetShowToolTip(this);
            }
            set
            {
                SetShowToolTip(this, value);
            }
        }
}

CustomColumn属性:

public class CustomColumn : DataGridTextColumn
{
        static CustomColumn ()
        {
              ShowToolTipProperty = CustomGrid.ShowToolTipProperty.AddOwner(typeof(CustomColumn ), 
            new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits));
        }

        public bool ShowToolTip
        {
           get { return (bool)GetValue(ShowToolTipProperty); }
           set { SetValue(ShowToolTipProperty, value); }
        }
}

在Xaml中使用(仅绑定相关属性)

<myNamespace:CustomGrid Name="myGrid"  ShowToolTip="False">
    <DataGrid.Columns>
        <myNamespace:CustomColumn Binding="{Binding Value1}" ShowToolTip="True"/>
        <myNamespace:CustomColumn Binding="{Binding Value2}" ShowToolTip="False"/>
        <myNamespace:CustomColumn Binding="{Binding Value3}" /> 
    </DataGrid.Columns>
</myNamespace:CustomGrid >

在这个例子中,我希望:

  • Column1(Value1):应显示工具提示
  • Column2(Value2):不应显示工具提示
  • Column3(Value3):不应显示工具提示

我得到了什么:

  • Column1(Value1):显示工具提示
  • Column2(Value2):不显示工具提示
  • Column3(Value3):显示工具提示

似乎它正在为CustomColumn类中的属性设置默认值。

我尝试更改CustomColumn.ShowToolTip属性与CustomGrid.ShowToolTip属性的关联,但它并不重要,它从不继承CustomGrid中的值。

ShowToolTipProperty = CustomGrid.ShowToolTipProperty.AddOwner(typeof(CustomColumn ), 
                new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Inherits));

我需要做些什么才能使CustomColumn.ShowToolTip属性从teg CustomGrid.ShowToolTip属性继承其值?

1 个答案:

答案 0 :(得分:3)

DataGridColumn未放置在DataGrid下的VisualTree中。 这是一种常见的误解。

如下所示:

enter image description here

您通过DataGrid设置并影响列的所有依赖项属性都不会继承,并且在DataGrid代码中完成。

例如:DataGrid的 CanUserResizeColumns 属性设置DataGridColumn&#39; s   CanUserResize 属性。你看一下源代码,看看它是如何完成的。

您还可以看到DataGrid的列存储在Property中,而不是DataGrid的内容。