c# - 子级不继承依赖属性值并采用默认值

标签 c# wpf

我有一个依赖属性,它应该从附加属性继承其值,但它从来没有这样做。它似乎总是采用默认值。

我的设置

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

我的 CustomGrid 有一个可继承的附加属性“ShowToolTip”,带有 Inherits 标志,我的 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);
            }
        }
}

自定义列属性:

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中使用(仅绑定(bind)相关属性)

<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(值2):不应显示工具提示
  • Column3(Value3):不应显示工具提示

我得到了什么:

  • Column1(值 1):显示工具提示
  • Column2(值2):不显示工具提示
  • 第 3 列(值 3):显示工具提示

它似乎采用了为 CustomColumn 类中的属性设置的默认值。

我尝试更改 CustomColumn.ShowToolTip 属性与 CustomGrid.ShowToolTip 属性的关联,但无论我做什么,它都不会继承 CustomGrid 的值。

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

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

最佳答案

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

如下所示:

enter image description here

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

例如:DataGrid 的 CanUserResizeColumns 属性设置 DataGridColumn CanUserResize 属性。您是否查看了源代码以了解其如何完成的示例。

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

关于c# - 子级不继承依赖属性值并采用默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30062112/

相关文章:

c# - .net 中使用的所有语言都具有相同的性能吗?

c# - c++ 中是否存在来自 c# 的更准确的 Timers.Timer?

wpf - 在 WPF 中,如何在右键单击时选择光标下的 TreeView 项?

c# - 在 WPF 中打印 DataGrid 中的所有数据

c# - WPF 获取 UI 线程,或如何从非 UI 线程显示窗口

c# - 如何从 ViewModel 创建和显示弹出窗口

wpf - WPF 切换按钮的 IsChecked 属性的 ValueConverter

c# - 找不到具有名称/ key 的资源

c# - 在 Windows 窗体 DataGridView 单元格中托管 TreeView

c# - "Asynchronous operations are not allowed in this context"